1
0
Fork 0
fgdata/Shaders/HDR/terrain_envmap.frag
Fernando García Liñán 1e66c4104a HDR: Improved environment mapping
- Terrain and clouds and now rendered on the envmap, with correct aerial
  perspective.
- Each face is rendered on a separate frame to help with performance.
- All faces are updated every 1.5 minutes. This can be changed through a
  property.
2023-05-03 02:03:10 +02:00

52 lines
1.3 KiB
GLSL

#version 330 core
layout(location = 0) out vec4 fragColor;
in VS_OUT {
vec2 texcoord;
vec2 orthophoto_texcoord;
vec3 vertex_normal;
vec3 world_vector;
} fs_in;
uniform sampler2D color_tex;
uniform sampler2D orthophoto_tex;
uniform bool orthophotoAvailable;
uniform vec3 fg_SunDirectionWorld;
uniform vec4 fg_Viewport;
// math.glsl
float M_1_PI();
// color.glsl
vec3 eotf_inverse_sRGB(vec3 srgb);
// sun.glsl
vec3 get_sun_radiance_sea_level();
// aerial_perspective_envmap.glsl
vec4 get_aerial_perspective(vec3 pos);
vec3 mix_aerial_perspective(vec3 color, vec4 ap);
void main()
{
vec3 texel = texture(color_tex, fs_in.texcoord).rgb;
if (orthophotoAvailable) {
vec4 sat_texel = texture(orthophoto_tex, fs_in.orthophoto_texcoord);
if (sat_texel.a > 0.0) {
texel.rgb = sat_texel.rgb;
}
}
vec3 color = eotf_inverse_sRGB(texel);
vec3 sun_radiance = get_sun_radiance_sea_level();
vec3 N = normalize(fs_in.vertex_normal);
float NdotL = max(dot(N, fg_SunDirectionWorld), 1e-4);
// Assume a perfectly diffuse Lambertian surface
color = M_1_PI() * color * sun_radiance * NdotL;
vec4 ap = get_aerial_perspective(fs_in.world_vector);
color = mix_aerial_perspective(color, ap);
fragColor = vec4(color, 1.0);
}