From c20b4b1fbba6f8d7b59ea9f8bd5eb7e342000cad Mon Sep 17 00:00:00 2001 From: Frederic Bouvier Date: Wed, 8 Aug 2012 09:02:26 +0200 Subject: [PATCH] No code change - Improve readability by reindenting files --- Effects/terrain-default.eff | 897 +++++++++++++---------------- Shaders/terrain-haze-detailed.frag | 730 ++++++++++++----------- 2 files changed, 748 insertions(+), 879 deletions(-) diff --git a/Effects/terrain-default.eff b/Effects/terrain-default.eff index d470b92e4..42823e4f3 100644 --- a/Effects/terrain-default.eff +++ b/Effects/terrain-default.eff @@ -1,96 +1,95 @@ - Effects/terrain-default - - - - + Effects/terrain-default + + + + 0.2 .2 0.2 1.0 - + .8 .8 .8 1.0 - + 0.0 0.0 0.0 1.0 - + 0.0 0.0 0.0 1.0 - 1.2 - - - Textures/Terrain/unknown.png - linear-mipmap-linear - - repeat - repeat - + repeat + repeat + - - normalized - - - Textures.high/Terrain/snow3.png - linear-mipmap-linear - repeat - repeat - normalized - - - Textures/Terrain/void.png - linear-mipmap-linear - repeat - repeat - normalized - - - Textures/Terrain/void.png - linear-mipmap-linear - repeat - repeat - normalized - - false - - 0 - RenderBin - - 0 - /environment/ground-visibility-m - /environment/visibility-m - /environment/ground-haze-thickness-m - /rendering/scene/scattering - /environment/surface/scattering - /environment/terminator-relative-position-m - /environment/mean-terrain-elevation-m - /rendering/scene/overcast - /sim/rendering/eye-altitude-m - /environment/mysnow-level-m - /environment/surface/dust-cover-factor - /environment/surface/wetness - /sim/rendering/shaders/skydome - /environment/fog-structure - /sim/rendering/shaders/landmass - /sim/rendering/shaders/transition - - + normalized + + + Textures.high/Terrain/snow3.png + linear-mipmap-linear + repeat + repeat + normalized + + + Textures/Terrain/void.png + linear-mipmap-linear + repeat + repeat + normalized + + + Textures/Terrain/void.png + linear-mipmap-linear + repeat + repeat + normalized + + false + + 0 + RenderBin + + 0 + /environment/ground-visibility-m + /environment/visibility-m + /environment/ground-haze-thickness-m + /rendering/scene/scattering + /environment/surface/scattering + /environment/terminator-relative-position-m + /environment/mean-terrain-elevation-m + /rendering/scene/overcast + /sim/rendering/eye-altitude-m + /environment/mysnow-level-m + /environment/surface/dust-cover-factor + /environment/surface/wetness + /sim/rendering/shaders/skydome + /environment/fog-structure + /sim/rendering/shaders/landmass + /sim/rendering/shaders/transition + + - - + /sim/rendering/shaders/skydome - - - 4.0 - /sim/rendering/shaders/landmass - - - 3.0 - /sim/rendering/shaders/transition - - + + + 4.0 + /sim/rendering/shaders/landmass + + + 3.0 + /sim/rendering/shaders/transition + + 2.0 @@ -128,24 +127,21 @@ texture[0]/filter texture[0]/wrap-s texture[0]/wrap-t - - texture[0]/internal-format - + texture[0]/internal-format --> - - Shaders/trivial.vert - Shaders/trivial.frag + + Shaders/trivial.vert + Shaders/trivial.frag - 0 0 0 0 @@ -166,53 +162,45 @@ render-bin/bin-number render-bin/bin-name - + --> 0 - texture[0]/image - texture[0]/filter - texture[0]/wrap-s - texture[0]/wrap-t - - texture[0]/internal-format - + texture[0]/image + texture[0]/filter + texture[0]/wrap-s + texture[0]/wrap-t + texture[0]/internal-format - 1 - noise + 1 + noise 5 - texture[12]/image - texture[12]/filter - texture[12]/wrap-s - texture[12]/wrap-t - - texture[12]/internal-format - + texture[12]/image + texture[12]/filter + texture[12]/wrap-s + texture[12]/wrap-t + texture[12]/internal-format 6 - texture[10]/image - texture[10]/filter - texture[10]/wrap-s - texture[10]/wrap-t - - texture[10]/internal-format - + texture[10]/image + texture[10]/filter + texture[10]/wrap-s + texture[10]/wrap-t + texture[10]/internal-format 7 - texture[11]/image - texture[11]/filter - texture[11]/wrap-s - texture[11]/wrap-t - - texture[11]/internal-format - + texture[11]/image + texture[11]/filter + texture[11]/wrap-s + texture[11]/wrap-t + texture[11]/internal-format Shaders/terrain-haze-detailed.vert @@ -228,7 +216,7 @@ float avisibility - + hazeLayerAltitude float lthickness @@ -258,40 +246,40 @@ float overcast - + eye_alt float eye_alt - mysnowlevel - float - mysnow_level - - - dust_cover_factor - float - dust_cover_factor + mysnowlevel + float + mysnow_level - wetness - float - wetness - - - fogstructure - float - fogstructure + dust_cover_factor + float + dust_cover_factor - quality_level - int - quality_level + wetness + float + wetness - tquality_level - int - tquality_level + fogstructure + float + fogstructure + + + quality_level + int + quality_level + + + tquality_level + int + tquality_level texture @@ -299,29 +287,30 @@ 0 - NoiseTex - sampler-3d - 1 + NoiseTex + sampler-3d + 1 - mix_texture - sampler-2d - 5 + mix_texture + sampler-2d + 5 - snow_texture - sampler-2d - 6 + snow_texture + sampler-2d + 6 - detail_texture - sampler-2d - 7 + detail_texture + sampler-2d + 7 colorMode int - 2 + 2 + lequal @@ -329,9 +318,7 @@ - - - + /sim/rendering/shaders/skydome @@ -368,19 +355,17 @@ 0 - texture[0]/image - texture[0]/filter - texture[0]/wrap-s - texture[0]/wrap-t - - texture[0]/internal-format - + texture[0]/image + texture[0]/filter + texture[0]/wrap-s + texture[0]/wrap-t + texture[0]/internal-format - Shaders/include_fog.vert - Shaders/default.vert - Shaders/include_fog.frag - Shaders/terrain-nocolor.frag + Shaders/include_fog.vert + Shaders/default.vert + Shaders/include_fog.frag + Shaders/terrain-nocolor.frag texture @@ -409,13 +394,11 @@ 0 - texture[0]/image - texture[0]/filter - texture[0]/wrap-s - texture[0]/wrap-t - - texture[0]/internal-format - + texture[0]/image + texture[0]/filter + texture[0]/wrap-s + texture[0]/wrap-t + texture[0]/internal-format Shaders/terrain-haze.vert @@ -431,7 +414,7 @@ float avisibility - + hazeLayerAltitude float lthickness @@ -461,7 +444,7 @@ float overcast - + eye_alt float eye_alt @@ -474,7 +457,8 @@ colorMode int - 2 + 2 + lequal @@ -482,333 +466,236 @@ - - - - - /sim/rendering/rembrandt/enabled - - - 2.0 - - - - GL_ARB_shader_objects - GL_ARB_shading_language_100 - GL_ARB_vertex_shader - GL_ARB_fragment_shader - - - - - - false - - material/ambient - material/diffuse - material/specular - material/emissive - material/shininess - ambient-and-diffuse - - false - true - smooth - back - - 1 - RenderBin - - - 0 - texture[0]/image - texture[0]/filter - texture[0]/wrap-s - texture[0]/wrap-t - - texture[0]/internal-format - - - modulate - - - - Shaders/deferred-gbuffer.vert - Shaders/deferred-gbuffer.frag - Shaders/gbuffer-functions.frag - Shaders/gbuffer-encode.frag - - - texture - sampler-2d - 0 - - - - - - - - - /sim/rendering/shaders/generic - - - - 2.0 - - - - GL_ARB_shader_objects - GL_ARB_shading_language_100 - GL_ARB_vertex_shader - GL_ARB_fragment_shader - - - - - - true - - - material/ambient - - - material/diffuse - - - material/specular - - - material/emissive - - - material/shininess - - ambient-and-diffuse - - - transparent - - smooth - back - - -1 - RenderBin - - - 0 - - texture[0]/image - - - texture[0]/filter - - - texture[0]/wrap-s - - - texture[0]/wrap-t - - - texture[0]/internal-format - - - - Shaders/include_fog.vert - Shaders/default.vert - Shaders/include_fog.frag - Shaders/terrain-nocolor.frag - - - texture - sampler-2d - 0 - - 0 0 0 0 - - - true - - - material/ambient - - - material/diffuse - - - material/specular - - - material/emissive - - - material/shininess - - ambient-and-diffuse - - - transparent - - - transparent - - smooth - back - - - render-bin/bin-number - - - render-bin/bin-name - - - - 0 - - texture[0]/image - - - texture[0]/filter - - - texture[0]/wrap-s - - - texture[0]/wrap-t - - - texture[0]/internal-format - - - - Shaders/include_fog.vert - Shaders/default.vert - Shaders/default.frag - Shaders/include_fog.frag - - - visibility - float - - visibility - - - - avisibility - float - - avisibility - - - - hazeLayerAltitude - float - - lthickness - - - - scattering - float - - scattering - - - - terminator - float - - terminator - - - - fogType - int - - fogtype - - - - texture - sampler-2d - 0 - - - colorMode - int - 2 - - - - lequal - false - - - - - - - - true - - - material/ambient - - - material/diffuse - - - material/specular - - - material/emissive - - - material/shininess - - ambient-and-diffuse - - - transparent - - - transparent - - smooth - back - - - render-bin/bin-number - - - render-bin/bin-name - - - - 0 - - texture[0]/image - - - texture[0]/filter - - - texture[0]/wrap-s - - - texture[0]/wrap-t - - - texture[0]/internal-format - - - modulate - - - - + + + + + + /sim/rendering/shaders/generic + + + 2.0 + + + + GL_ARB_shader_objects + GL_ARB_shading_language_100 + GL_ARB_vertex_shader + GL_ARB_fragment_shader + + + + + + true + + material/ambient + material/diffuse + material/specular + material/emissive + material/shininess + ambient-and-diffuse + + transparent + smooth + back + + -1 + RenderBin + + + 0 + texture[0]/image + texture[0]/filter + texture[0]/wrap-s + texture[0]/wrap-t + texture[0]/internal-format + + + Shaders/include_fog.vert + Shaders/default.vert + Shaders/include_fog.frag + Shaders/terrain-nocolor.frag + + + texture + sampler-2d + 0 + + 0 0 0 0 + + + true + + material/ambient + material/diffuse + material/specular + material/emissive + material/shininess + ambient-and-diffuse + + transparent + transparent + smooth + back + + render-bin/bin-number + render-bin/bin-name + + + 0 + texture[0]/image + texture[0]/filter + texture[0]/wrap-s + texture[0]/wrap-t + texture[0]/internal-format + + + Shaders/include_fog.vert + Shaders/default.vert + Shaders/default.frag + Shaders/include_fog.frag + + + visibility + float + visibility + + + avisibility + float + avisibility + + + hazeLayerAltitude + float + lthickness + + + scattering + float + scattering + + + terminator + float + terminator + + + fogType + int + fogtype + + + texture + sampler-2d + 0 + + + colorMode + int + 2 + + + + lequal + false + + + + + + true + + material/ambient + material/diffuse + material/specular + material/emissive + material/shininess + ambient-and-diffuse + + transparent + transparent + smooth + back + + render-bin/bin-number + render-bin/bin-name + + + 0 + texture[0]/image + texture[0]/filter + texture[0]/wrap-s + texture[0]/wrap-t + texture[0]/internal-format + + modulate + + + + diff --git a/Shaders/terrain-haze-detailed.frag b/Shaders/terrain-haze-detailed.frag index db08d43f8..2cb314665 100644 --- a/Shaders/terrain-haze-detailed.frag +++ b/Shaders/terrain-haze-detailed.frag @@ -51,53 +51,53 @@ float cosine_interpolate(in float a, in float b, in float x) { float ft = x * 3.1415927; float f = (1.0 - cos(ft)) * .5; - + return a*(1.0-f) + b*f; } float simple_interpolate(in float a, in float b, in float x) { -return a + smoothstep(0.0,1.0,x) * (b-a); -//return mix(a,b,x); + return a + smoothstep(0.0,1.0,x) * (b-a); + //return mix(a,b,x); } float interpolatedNoise2D(in float x, in float y) { - float integer_x = x - fract(x); - float fractional_x = x - integer_x; - - float integer_y = y - fract(y); - float fractional_y = y - integer_y; - - float v1 = rand2D(vec2(integer_x, integer_y)); - float v2 = rand2D(vec2(integer_x+1.0, integer_y)); - float v3 = rand2D(vec2(integer_x, integer_y+1.0)); - float v4 = rand2D(vec2(integer_x+1.0, integer_y +1.0)); - - float i1 = simple_interpolate(v1 , v2 , fractional_x); - float i2 = simple_interpolate(v3 , v4 , fractional_x); - - return simple_interpolate(i1 , i2 , fractional_y); + float integer_x = x - fract(x); + float fractional_x = x - integer_x; + + float integer_y = y - fract(y); + float fractional_y = y - integer_y; + + float v1 = rand2D(vec2(integer_x, integer_y)); + float v2 = rand2D(vec2(integer_x+1.0, integer_y)); + float v3 = rand2D(vec2(integer_x, integer_y+1.0)); + float v4 = rand2D(vec2(integer_x+1.0, integer_y +1.0)); + + float i1 = simple_interpolate(v1 , v2 , fractional_x); + float i2 = simple_interpolate(v3 , v4 , fractional_x); + + return simple_interpolate(i1 , i2 , fractional_y); } float Noise2D(in vec2 coord, in float wavelength) { -return interpolatedNoise2D(coord.x/wavelength, coord.y/wavelength); - + return interpolatedNoise2D(coord.x/wavelength, coord.y/wavelength); + } float light_func (in float x, in float a, in float b, in float c, in float d, in float e) { -x = x - 0.5; - -// use the asymptotics to shorten computations -if (x > 30.0) {return e;} -if (x < -15.0) {return 0.0;} - -return e / pow((1.0 + a * exp(-b * (x-c)) ),(1.0/d)); + x = x - 0.5; + + // use the asymptotics to shorten computations + if (x > 30.0) {return e;} + if (x < -15.0) {return 0.0;} + + return e / pow((1.0 + a * exp(-b * (x-c)) ),(1.0/d)); } // this determines how light is attenuated in the distance @@ -106,38 +106,32 @@ return e / pow((1.0 + a * exp(-b * (x-c)) ),(1.0/d)); float fog_func (in float targ) { - - -float fade_mix; - -// for large altitude > 30 km, we switch to some component of quadratic distance fading to -// create the illusion of improved visibility range - -targ = 1.25 * targ * smoothstep(0.04,0.06,targ); // need to sync with the distance to which terrain is drawn - - -if (alt < 30000.0) - {return exp(-targ - targ * targ * targ * targ);} -else if (alt < 50000.0) - { - fade_mix = (alt - 30000.0)/20000.0; - return fade_mix * exp(-targ*targ - pow(targ,4.0)) + (1.0 - fade_mix) * exp(-targ - pow(targ,4.0)); + float fade_mix; + + // for large altitude > 30 km, we switch to some component of quadratic distance fading to + // create the illusion of improved visibility range + + targ = 1.25 * targ * smoothstep(0.04,0.06,targ); // need to sync with the distance to which terrain is drawn + + + if (alt < 30000.0) { + return exp(-targ - targ * targ * targ * targ); } -else - { - return exp(- targ * targ - pow(targ,4.0)); + else if (alt < 50000.0) { + fade_mix = (alt - 30000.0)/20000.0; + return fade_mix * exp(-targ*targ - pow(targ,4.0)) + (1.0 - fade_mix) * exp(-targ - pow(targ,4.0)); } - + else { + return exp(- targ * targ - pow(targ,4.0)); + } + } void main() { - - - -float dist = length(relPos); - -// this is taken from default.frag + float dist = length(relPos); + + // this is taken from default.frag vec3 n; float NdotL, NdotHV, fogFactor; vec4 color = gl_Color; @@ -152,359 +146,347 @@ float dist = length(relPos); vec4 specular = vec4(0.0); float intensity; - -// get noise at different wavelengths - -// used: 5m, 5m gradient, 10m, 10m gradient: heightmap of the closeup terrain, 10m also snow -// 50m: detail texel -// 250m: detail texel -// 500m: distortion and overlay -// 1500m: overlay, detail, dust, fog -// 2000m: overlay, detail, snow, fog - -float noise_10m; -float noise_5m; -noise_10m = Noise2D(rawPos.xy, 10.0); -noise_5m = Noise2D(rawPos.xy ,5.0); - -float noisegrad_10m; -float noisegrad_5m; - -float noise_50m; -float noise_250m; -float noise_500m = Noise2D(rawPos.xy, 500.0); -float noise_1500m = Noise2D(rawPos.xy, 1500.0); -float noise_2000m = Noise2D(rawPos.xy, 2000.0); - - - - - -// - - -// get the texels - + + // get noise at different wavelengths + + // used: 5m, 5m gradient, 10m, 10m gradient: heightmap of the closeup terrain, 10m also snow + // 50m: detail texel + // 250m: detail texel + // 500m: distortion and overlay + // 1500m: overlay, detail, dust, fog + // 2000m: overlay, detail, snow, fog + + float noise_10m; + float noise_5m; + noise_10m = Noise2D(rawPos.xy, 10.0); + noise_5m = Noise2D(rawPos.xy ,5.0); + + float noisegrad_10m; + float noisegrad_5m; + + float noise_50m; + float noise_250m; + float noise_500m = Noise2D(rawPos.xy, 500.0); + float noise_1500m = Noise2D(rawPos.xy, 1500.0); + float noise_2000m = Noise2D(rawPos.xy, 2000.0); + + // + // get the texels + texel = texture2D(texture, gl_TexCoord[0].st); - + float distortion_factor = 1.0; vec2 stprime; int flag = 1; int mix_flag = 1; - + if (quality_level > 3) { - snow_texel = texture2D(snow_texture, gl_TexCoord[0].st); + snow_texel = texture2D(snow_texture, gl_TexCoord[0].st); } - + if (tquality_level > 2) { - mix_texel = texture2D(mix_texture, gl_TexCoord[0].st * 1.3); - if (mix_texel.a <0.1) {mix_flag = 0;} - } - - - if (tquality_level > 3) + mix_texel = texture2D(mix_texture, gl_TexCoord[0].st * 1.3); + if (mix_texel.a <0.1) {mix_flag = 0;} + } + + + if (tquality_level > 3) { - stprime = vec2 (0.86*gl_TexCoord[0].s + 0.5*gl_TexCoord[0].t, 0.5*gl_TexCoord[0].s - 0.86*gl_TexCoord[0].t); - //distortion_factor = 0.9375 + (1.0 * nvL[2]); - distortion_factor = 0.97 + 0.06 * noise_500m; - stprime = stprime * distortion_factor * 15.0; - if (quality_level > 4) + stprime = vec2 (0.86*gl_TexCoord[0].s + 0.5*gl_TexCoord[0].t, 0.5*gl_TexCoord[0].s - 0.86*gl_TexCoord[0].t); + //distortion_factor = 0.9375 + (1.0 * nvL[2]); + distortion_factor = 0.97 + 0.06 * noise_500m; + stprime = stprime * distortion_factor * 15.0; + if (quality_level > 4) { - stprime = stprime + normalize(relPos).xy * 0.02 * (noise_10m + 0.5 * noise_5m - 0.75); + stprime = stprime + normalize(relPos).xy * 0.02 * (noise_10m + 0.5 * noise_5m - 0.75); } - detail_texel = texture2D(detail_texture, stprime); - if (detail_texel.a <0.1) {flag = 0;} + detail_texel = texture2D(detail_texture, stprime); + if (detail_texel.a <0.1) {flag = 0;} } - - -// texture preparation according to detail level - -// mix in hires texture patches - -float dist_fact; -float nSum; -float mix_factor; - -if (tquality_level > 2) - { - // first the second texture overlay - - - if (mix_flag == 1) + + + // texture preparation according to detail level + + // mix in hires texture patches + + float dist_fact; + float nSum; + float mix_factor; + + if (tquality_level > 2) { - nSum = nSum + 0.2 * (2.0 * noise_2000m + 2.0 * noise_1500m + noise_500m); - nSum = nSum + 0.2 * (1.0 -smoothstep(0.9,0.95, abs(steepness))); - mix_factor = smoothstep(0.5, 0.54, nSum); - texel = mix(texel, mix_texel, mix_factor); - - } - - // then the detail texture overlay - } - -if (tquality_level > 3) - { - if (dist < 40000.0) - { - if (flag == 1) + // first the second texture overlay + + + if (mix_flag == 1) { - noise_50m = Noise2D(rawPos.xy, 50.0); - noise_250m = Noise2D(rawPos.xy, 250.0); - dist_fact = 0.1 * smoothstep(15000.0,40000.0, dist) - 0.03 * (1.0 - smoothstep(500.0,5000.0, dist)); - nSum = ((1.0 -noise_2000m) + noise_1500m + 2.0 * noise_250m +noise_50m)/5.0; - nSum = nSum - 0.03 * (1.0 -smoothstep(0.9,0.95, abs(steepness))); - mix_factor = smoothstep(0.47, 0.54, nSum - dist_fact); - if (mix_factor > 0.8) {mix_factor = 0.8;} - texel = mix(texel, detail_texel,mix_factor); + nSum = nSum + 0.2 * (2.0 * noise_2000m + 2.0 * noise_1500m + noise_500m); + nSum = nSum + 0.2 * (1.0 -smoothstep(0.9,0.95, abs(steepness))); + mix_factor = smoothstep(0.5, 0.54, nSum); + texel = mix(texel, mix_texel, mix_factor); + } + + // then the detail texture overlay + } + + if (tquality_level > 3) + { + if (dist < 40000.0) + { + if (flag == 1) + { + noise_50m = Noise2D(rawPos.xy, 50.0); + noise_250m = Noise2D(rawPos.xy, 250.0); + dist_fact = 0.1 * smoothstep(15000.0,40000.0, dist) - 0.03 * (1.0 - smoothstep(500.0,5000.0, dist)); + nSum = ((1.0 -noise_2000m) + noise_1500m + 2.0 * noise_250m +noise_50m)/5.0; + nSum = nSum - 0.03 * (1.0 -smoothstep(0.9,0.95, abs(steepness))); + mix_factor = smoothstep(0.47, 0.54, nSum - dist_fact); + if (mix_factor > 0.8) {mix_factor = 0.8;} + texel = mix(texel, detail_texel,mix_factor); + } } } - } - - -vec4 dust_color; -float snow_alpha; - -if (quality_level > 3) + + + vec4 dust_color; + float snow_alpha; + + if (quality_level > 3) { - // mix dust - dust_color = vec4 (0.76, 0.71, 0.56, 1.0); - - texel = mix(texel, dust_color, clamp(0.5 * dust_cover_factor + 3.0 * dust_cover_factor * (((noise_1500m - 0.5) * 0.125)+0.125 ),0.0, 1.0) ); - - // mix snow - snow_alpha = smoothstep(0.75, 0.85, abs(steepness)); - texel = mix(texel, snow_texel, smoothstep(mysnowlevel, mysnowlevel+200.0, snow_alpha * (relPos.z + eye_alt)+ (noise_2000m + 0.1 * noise_10m -0.55) *400.0)); + // mix dust + dust_color = vec4 (0.76, 0.71, 0.56, 1.0); + + texel = mix(texel, dust_color, clamp(0.5 * dust_cover_factor + 3.0 * dust_cover_factor * (((noise_1500m - 0.5) * 0.125)+0.125 ),0.0, 1.0) ); + + // mix snow + snow_alpha = smoothstep(0.75, 0.85, abs(steepness)); + texel = mix(texel, snow_texel, smoothstep(mysnowlevel, mysnowlevel+200.0, snow_alpha * (relPos.z + eye_alt)+ (noise_2000m + 0.1 * noise_10m -0.55) *400.0)); } - - - -// get distribution of water when terrain is wet - -float water_threshold1; -float water_threshold2; -float water_factor =0.0; - - -if ((dist < 5000.0)&& (quality_level > 3) && (wetness>0.0)) - { + + + + // get distribution of water when terrain is wet + + float water_threshold1; + float water_threshold2; + float water_factor =0.0; + + + if ((dist < 5000.0)&& (quality_level > 3) && (wetness>0.0)) + { water_threshold1 = 1.0-0.5* wetness; water_threshold2 = 1.0 - 0.3 * wetness; water_factor = smoothstep(water_threshold1, water_threshold2 , (0.3 * (2.0 * (1.0-noise_10m) + (1.0 -noise_5m)) * (1.0 - smoothstep(2000.0, 5000.0, dist))) - 5.0 * (1.0 -steepness)); } - -// darken wet terrain - - texel.rgb = texel.rgb * (1.0 - 0.6 * wetness); - - -// light computations - - - vec4 light_specular = gl_LightSource[0].specular; - - // If gl_Color.a == 0, this is a back-facing polygon and the - // normal should be reversed. - n = (2.0 * gl_Color.a - 1.0) * normal; - n = normalize(n); - - NdotL = dot(n, lightDir); - if ((tquality_level > 3) && (mix_flag ==1)&& (dist < 2000.0) && (quality_level > 4)) - { - noisegrad_10m = (noise_10m - Noise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),10.0))/0.05; - noisegrad_5m = (noise_5m - Noise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),5.0))/0.05; - NdotL = NdotL + 1.0 * (noisegrad_10m + 0.5* noisegrad_5m) * mix_factor/0.8 * (1.0 - smoothstep(1000.0, 2000.0, dist)); - } - if (NdotL > 0.0) { - color += diffuse_term * NdotL; - NdotHV = max(dot(n, halfVector), 0.0); - if (gl_FrontMaterial.shininess > 0.0) - specular.rgb = ((gl_FrontMaterial.specular.rgb + (water_factor * vec3 (1.0, 1.0, 1.0))) - * light_specular.rgb - * pow(NdotHV, gl_FrontMaterial.shininess + (20.0 * water_factor))); - } - color.a = diffuse_term.a; - // This shouldn't be necessary, but our lighting becomes very - // saturated. Clamping the color before modulating by the texture - // is closer to what the OpenGL fixed function pipeline does. - color = clamp(color, 0.0, 1.0); - - - - - fragColor = color * texel + specular; - -// here comes the terrain haze model - - -float delta_z = hazeLayerAltitude - eye_alt; - -if (dist > max(40.0, 0.04 * min(visibility,avisibility))) -//if ((gl_FragCoord.y > ylimit) || (gl_FragCoord.x < zlimit1) || (gl_FragCoord.x > zlimit2)) -//if (dist > 40.0) -{ - -alt = eye_alt; - - -float transmission; -float vAltitude; -float delta_zv; -float H; -float distance_in_layer; -float transmission_arg; - -// angle with horizon -float ct = dot(vec3(0.0, 0.0, 1.0), relPos)/dist; - - -// we solve the geometry what part of the light path is attenuated normally and what is through the haze layer - -if (delta_z > 0.0) // we're inside the layer - { - if (ct < 0.0) // we look down - { - distance_in_layer = dist; - vAltitude = min(distance_in_layer,min(visibility, avisibility)) * ct; - delta_zv = delta_z - vAltitude; - } - else // we may look through upper layer edge - { - H = dist * ct; - if (H > delta_z) {distance_in_layer = dist/H * delta_z;} - else {distance_in_layer = dist;} - vAltitude = min(distance_in_layer,visibility) * ct; - delta_zv = delta_z - vAltitude; - } - } - else // we see the layer from above, delta_z < 0.0 - { - H = dist * -ct; - if (H < (-delta_z)) // we don't see into the layer at all, aloft visibility is the only fading - { - distance_in_layer = 0.0; - delta_zv = 0.0; - } - else - { - vAltitude = H + delta_z; - distance_in_layer = vAltitude/H * dist; - vAltitude = min(distance_in_layer,visibility) * (-ct); - delta_zv = vAltitude; - } - } - -// ground haze cannot be thinner than aloft visibility in the model, -// so we need to use aloft visibility otherwise - - -transmission_arg = (dist-distance_in_layer)/avisibility; - - -float eqColorFactor; - - - -if (visibility < avisibility) + // darken wet terrain + + texel.rgb = texel.rgb * (1.0 - 0.6 * wetness); + + + // light computations + + + vec4 light_specular = gl_LightSource[0].specular; + + // If gl_Color.a == 0, this is a back-facing polygon and the + // normal should be reversed. + n = (2.0 * gl_Color.a - 1.0) * normal; + n = normalize(n); + + NdotL = dot(n, lightDir); + if ((tquality_level > 3) && (mix_flag ==1)&& (dist < 2000.0) && (quality_level > 4)) { - if (quality_level > 3) - { - transmission_arg = transmission_arg + (distance_in_layer/(1.0 * visibility + 1.0 * visibility * fogstructure * 0.06 * (noise_1500m + noise_2000m -1.0) )); - - } - else - { - transmission_arg = transmission_arg + (distance_in_layer/visibility); - } - // this combines the Weber-Fechner intensity - eqColorFactor = 1.0 - 0.1 * delta_zv/visibility - (1.0 -scattering); - + noisegrad_10m = (noise_10m - Noise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),10.0))/0.05; + noisegrad_5m = (noise_5m - Noise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),5.0))/0.05; + NdotL = NdotL + 1.0 * (noisegrad_10m + 0.5* noisegrad_5m) * mix_factor/0.8 * (1.0 - smoothstep(1000.0, 2000.0, dist)); } -else + if (NdotL > 0.0) { + color += diffuse_term * NdotL; + NdotHV = max(dot(n, halfVector), 0.0); + if (gl_FrontMaterial.shininess > 0.0) { + specular.rgb = ((gl_FrontMaterial.specular.rgb + (water_factor * vec3 (1.0, 1.0, 1.0))) + * light_specular.rgb + * pow(NdotHV, gl_FrontMaterial.shininess + (20.0 * water_factor))); + } + } + color.a = diffuse_term.a; + // This shouldn't be necessary, but our lighting becomes very + // saturated. Clamping the color before modulating by the texture + // is closer to what the OpenGL fixed function pipeline does. + color = clamp(color, 0.0, 1.0); + + + + + fragColor = color * texel + specular; + + // here comes the terrain haze model + + + float delta_z = hazeLayerAltitude - eye_alt; + + if (dist > max(40.0, 0.04 * min(visibility,avisibility))) + //if ((gl_FragCoord.y > ylimit) || (gl_FragCoord.x < zlimit1) || (gl_FragCoord.x > zlimit2)) + //if (dist > 40.0) { - if (quality_level > 3) + + alt = eye_alt; + + + float transmission; + float vAltitude; + float delta_zv; + float H; + float distance_in_layer; + float transmission_arg; + + // angle with horizon + float ct = dot(vec3(0.0, 0.0, 1.0), relPos)/dist; + + + // we solve the geometry what part of the light path is attenuated normally and what is through the haze layer + + if (delta_z > 0.0) // we're inside the layer { - transmission_arg = transmission_arg + (distance_in_layer/(1.0 * avisibility + 1.0 * avisibility * fogstructure * 0.06 * (noise_1500m + noise_2000m - 1.0) )); + if (ct < 0.0) // we look down + { + distance_in_layer = dist; + vAltitude = min(distance_in_layer,min(visibility, avisibility)) * ct; + delta_zv = delta_z - vAltitude; + } + else // we may look through upper layer edge + { + H = dist * ct; + if (H > delta_z) { + distance_in_layer = dist/H * delta_z; + } + else { + distance_in_layer = dist; + } + vAltitude = min(distance_in_layer,visibility) * ct; + delta_zv = delta_z - vAltitude; + } } - else + else // we see the layer from above, delta_z < 0.0 + { + H = dist * -ct; + if (H < (-delta_z)) // we don't see into the layer at all, aloft visibility is the only fading + { + distance_in_layer = 0.0; + delta_zv = 0.0; + } + else + { + vAltitude = H + delta_z; + distance_in_layer = vAltitude/H * dist; + vAltitude = min(distance_in_layer,visibility) * (-ct); + delta_zv = vAltitude; + } + } + + + // ground haze cannot be thinner than aloft visibility in the model, + // so we need to use aloft visibility otherwise + + + transmission_arg = (dist-distance_in_layer)/avisibility; + + + float eqColorFactor; + + + + if (visibility < avisibility) { - transmission_arg = transmission_arg + (distance_in_layer/avisibility); + if (quality_level > 3) + { + transmission_arg = transmission_arg + (distance_in_layer/(1.0 * visibility + 1.0 * visibility * fogstructure * 0.06 * (noise_1500m + noise_2000m -1.0) )); + } + else + { + transmission_arg = transmission_arg + (distance_in_layer/visibility); + } + // this combines the Weber-Fechner intensity + eqColorFactor = 1.0 - 0.1 * delta_zv/visibility - (1.0 -scattering); + } - // this combines the Weber-Fechner intensity - eqColorFactor = 1.0 - 0.1 * delta_zv/avisibility - (1.0 -scattering); + else + { + if (quality_level > 3) + { + transmission_arg = transmission_arg + (distance_in_layer/(1.0 * avisibility + 1.0 * avisibility * fogstructure * 0.06 * (noise_1500m + noise_2000m - 1.0) )); + } + else + { + transmission_arg = transmission_arg + (distance_in_layer/avisibility); + } + // this combines the Weber-Fechner intensity + eqColorFactor = 1.0 - 0.1 * delta_zv/avisibility - (1.0 -scattering); + } + + + + transmission = fog_func(transmission_arg); + + // there's always residual intensity, we should never be driven to zero + if (eqColorFactor < 0.2) eqColorFactor = 0.2; + + + float lightArg = (terminator-yprime_alt)/100000.0; + + vec3 hazeColor; + + hazeColor.b = light_func(lightArg, 1.330e-05, 0.264, 2.527, 1.08e-05, 1.0); + hazeColor.g = light_func(lightArg, 3.931e-06, 0.264, 3.827, 7.93e-06, 1.0); + hazeColor.r = light_func(lightArg, 8.305e-06, 0.161, 3.827, 3.04e-05, 1.0); + + + // now dim the light for haze + eShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt) + 0.1; + + // Mie-like factor + + if (lightArg < 5.0) + { + intensity = length(hazeColor); + float mie_magnitude = 0.5 * smoothstep(350000.0, 150000.0, terminator-sqrt(2.0 * EarthRadius * terrain_alt)); + hazeColor = intensity * ((1.0 - mie_magnitude) + mie_magnitude * mie_angle) * normalize(mix(hazeColor, vec3 (0.5, 0.58, 0.65), mie_magnitude * (0.5 - 0.5 * mie_angle)) ); + } + + // high altitude desaturation of the haze color + + intensity = length(hazeColor); + hazeColor = intensity * normalize (mix(hazeColor, intensity * vec3 (1.0,1.0,1.0), 0.7* smoothstep(5000.0, 50000.0, alt))); + + // blue hue of haze + + hazeColor.x = hazeColor.x * 0.83; + hazeColor.y = hazeColor.y * 0.9; + + + // additional blue in indirect light + float fade_out = max(0.65 - 0.3 *overcast, 0.45); + intensity = length(hazeColor); + hazeColor = intensity * normalize(mix(hazeColor, 1.5* vec3 (0.45, 0.6, 0.8), 1.0 -smoothstep(0.25, fade_out,eShade) )); + + // change haze color to blue hue for strong fogging + hazeColor = intensity * normalize(mix(hazeColor, 2.0 * vec3 (0.55, 0.6, 0.8), (1.0-smoothstep(0.3,0.8,eqColorFactor)))); + + + // reduce haze intensity when looking at shaded surfaces, only in terminator region + + float shadow = mix( min(1.0 + dot(normal,lightDir),1.0), 1.0, 1.0-smoothstep(0.1, 0.4, transmission)); + hazeColor = mix(shadow * hazeColor, hazeColor, 0.3 + 0.7* smoothstep(250000.0, 400000.0, terminator)); + + fragColor.xyz = mix(eqColorFactor * hazeColor * eShade, fragColor.xyz,transmission); + + gl_FragColor = fragColor; } - - - -transmission = fog_func(transmission_arg); - -// there's always residual intensity, we should never be driven to zero -if (eqColorFactor < 0.2) eqColorFactor = 0.2; - - -float lightArg = (terminator-yprime_alt)/100000.0; - -vec3 hazeColor; - -hazeColor.b = light_func(lightArg, 1.330e-05, 0.264, 2.527, 1.08e-05, 1.0); -hazeColor.g = light_func(lightArg, 3.931e-06, 0.264, 3.827, 7.93e-06, 1.0); -hazeColor.r = light_func(lightArg, 8.305e-06, 0.161, 3.827, 3.04e-05, 1.0); - - -// now dim the light for haze -eShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt) + 0.1; - -// Mie-like factor - -if (lightArg < 5.0) - {intensity = length(hazeColor); - float mie_magnitude = 0.5 * smoothstep(350000.0, 150000.0, terminator-sqrt(2.0 * EarthRadius * terrain_alt)); - hazeColor = intensity * ((1.0 - mie_magnitude) + mie_magnitude * mie_angle) * normalize(mix(hazeColor, vec3 (0.5, 0.58, 0.65), mie_magnitude * (0.5 - 0.5 * mie_angle)) ); + else // if dist < threshold no fogging at all + { + gl_FragColor = fragColor; } - -// high altitude desaturation of the haze color - -intensity = length(hazeColor); -hazeColor = intensity * normalize (mix(hazeColor, intensity * vec3 (1.0,1.0,1.0), 0.7* smoothstep(5000.0, 50000.0, alt))); - -// blue hue of haze - -hazeColor.x = hazeColor.x * 0.83; -hazeColor.y = hazeColor.y * 0.9; - - -// additional blue in indirect light -float fade_out = max(0.65 - 0.3 *overcast, 0.45); -intensity = length(hazeColor); -hazeColor = intensity * normalize(mix(hazeColor, 1.5* vec3 (0.45, 0.6, 0.8), 1.0 -smoothstep(0.25, fade_out,eShade) )); - -// change haze color to blue hue for strong fogging -hazeColor = intensity * normalize(mix(hazeColor, 2.0 * vec3 (0.55, 0.6, 0.8), (1.0-smoothstep(0.3,0.8,eqColorFactor)))); - - -// reduce haze intensity when looking at shaded surfaces, only in terminator region - -float shadow = mix( min(1.0 + dot(normal,lightDir),1.0), 1.0, 1.0-smoothstep(0.1, 0.4, transmission)); -hazeColor = mix(shadow * hazeColor, hazeColor, 0.3 + 0.7* smoothstep(250000.0, 400000.0, terminator)); - - - - -fragColor.xyz = mix(eqColorFactor * hazeColor * eShade, fragColor.xyz,transmission); - - -gl_FragColor = fragColor; - - } -else // if dist < threshold no fogging at all -{ -gl_FragColor = fragColor; -} - - - -} -