diff --git a/Effects/urban.eff b/Effects/urban.eff index a542bfb3e..cc7d791ea 100644 --- a/Effects/urban.eff +++ b/Effects/urban.eff @@ -239,6 +239,16 @@ quality-level + + gquality_level + int + quality_level + + + tquality_level + int + tquality_level + snowlevel float diff --git a/Shaders/agriculture-ALS.frag b/Shaders/agriculture-ALS.frag index 2c9074313..3f4ffc3ea 100644 --- a/Shaders/agriculture-ALS.frag +++ b/Shaders/agriculture-ALS.frag @@ -458,6 +458,14 @@ if ((dist < 5000.0)&& (quality_level > 3) && (combined_wetness>0.0)) fragColor = color * texel + specular; + + vec3 hazeColor; + float lightArg = (terminator-yprime_alt)/100000.0; + 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); + + // Rayleigh color shift due to out-scattering float rayleigh_length = 0.5 * avisibility * (2.5 - 1.9 * air_pollution)/alt_factor(eye_alt, eye_alt+relPos.z); float outscatter = 1.0-exp(-dist/rayleigh_length); @@ -465,11 +473,12 @@ if ((dist < 5000.0)&& (quality_level > 3) && (combined_wetness>0.0)) // Rayleigh color shift due to in-scattering -float rShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt-340000.0); -float lightIntensity = length(diffuse_term.rgb)/1.73 * rShade; -vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; -float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); -fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); + float rShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt + 420000.0); + //float lightIntensity = length(diffuse_term.rgb)/1.73 * rShade; + float lightIntensity = length(hazeColor * effective_scattering) * rShade; + vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; + float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); + fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); // here comes the terrain haze model @@ -596,11 +605,6 @@ 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 diff --git a/Shaders/airfield-ALS.frag b/Shaders/airfield-ALS.frag index 16c629569..6ea8eaef6 100644 --- a/Shaders/airfield-ALS.frag +++ b/Shaders/airfield-ALS.frag @@ -309,16 +309,31 @@ if (quality_level > 3) fragColor = color * texel + specular; + + 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); + // Rayleigh color shift due to out-scattering - float rayleigh_length; - float outscatter; + if ((quality_level > 5) && (tquality_level > 5)) { - rayleigh_length = 0.5 * avisibility * (2.5 - 1.9 * air_pollution)/alt_factor(eye_alt, eye_alt+relPos.z); - outscatter = 1.0-exp(-dist/rayleigh_length); + float rayleigh_length = 0.5 * avisibility * (2.5 - 1.9 * air_pollution)/alt_factor(eye_alt, eye_alt+relPos.z); + float outscatter = 1.0-exp(-dist/rayleigh_length); fragColor.rgb = rayleigh_out_shift(fragColor.rgb,outscatter); +// Rayleigh color shift due to in-scattering + float rShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt + 420000.0); + float lightIntensity = length(hazeColor * effective_scattering) * rShade; + vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; + float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); + fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); } + // here comes the terrain haze model @@ -425,13 +440,7 @@ transmission = fog_func(transmission_arg, alt); 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 @@ -474,43 +483,16 @@ hazeColor = mix(shadow * hazeColor, hazeColor, 0.3 + 0.7* smoothstep(250000.0, 4 hazeColor = clamp(hazeColor,0.0,1.0); -// blue Rayleigh scattering with distance -float rShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt-340000.0) + 0.1; -float lightIntensity = length(diffuse_term.rgb)/1.73 * rShade; -vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; -float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); - -if ((quality_level>5) && (tquality_level>5)) - { - fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); - } fragColor.rgb = mix((eqColorFactor * hazeColor * eShade)+secondary_light * fog_backscatter(avisibility), fragColor.rgb,transmission); + +} + gl_FragColor = fragColor; -} -else // if dist < threshold no fogging at all -{ -// blue Rayleigh scattering with distance - -float rShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt-340000.0) + 0.1; -float lightIntensity = length(diffuse_term.rgb)/1.73 * rShade; -vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; -float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); - -if ((quality_level>5) && (tquality_level>5)) - { - fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); - } - -gl_FragColor = fragColor; -} - - - } diff --git a/Shaders/drunway-ALS.frag b/Shaders/drunway-ALS.frag index 2b7878657..241ff9913 100644 --- a/Shaders/drunway-ALS.frag +++ b/Shaders/drunway-ALS.frag @@ -55,12 +55,14 @@ float mie_angle; float shadow_func (in float x, in float y, in float noise, in float dist); float Noise2D(in vec2 coord, in float wavelength); float fog_func (in float targ, in float alt); +float alt_factor(in float eye_alt, in float vertex_alt); float light_distance_fading(in float dist); float fog_backscatter(in float avisibility); float rayleigh_in_func(in float dist, in float air_pollution, in float avisibility, in float eye_alt, in float vertex_alt); vec3 searchlight(); vec3 landing_light(in float offset); +vec3 rayleigh_out_shift(in vec3 color, in float outscatter); float light_func (in float x, in float a, in float b, in float c, in float d, in float e) @@ -281,6 +283,30 @@ if ((dist < 5000.0)&& (quality_level > 3) && (wetness>0.0)) fragColor = color * texel + specular; + +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); + +// Rayleigh color shifts + + if ((quality_level > 5) && (tquality_level > 5)) + { + float rayleigh_length = 0.5 * avisibility * (2.5 - 1.9 * air_pollution)/alt_factor(eye_alt, eye_alt+relPos.z); + float outscatter = 1.0-exp(-dist/rayleigh_length); + fragColor.rgb = rayleigh_out_shift(fragColor.rgb,outscatter); +// Rayleigh color shift due to in-scattering + float rShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt + 420000.0); + float lightIntensity = length(hazeColor * effective_scattering) * rShade; + vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; + float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); + fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); + } + // here comes the terrain haze model @@ -389,13 +415,7 @@ transmission = fog_func(transmission_arg, alt); 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 @@ -439,46 +459,14 @@ if (intensity > 0.0) // this needs to be a condition, because otherwise hazeColo hazeColor = mix(shadow * hazeColor, hazeColor, 0.3 + 0.7* smoothstep(250000.0, 400000.0, terminator)); } -// blue Rayleigh scattering with distance - - float rShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt-340000.0) + 0.1; - float lightIntensity = length(diffuse_term.rgb)/1.73 * rShade; - vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; - float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); - - if ((quality_level>5) && (tquality_level>5)) - { - fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); - } - - fragColor.rgb = mix((eqColorFactor * hazeColor * eShade) +secondary_light * fog_backscatter(avisibility) , fragColor.rgb,transmission); +} + gl_FragColor = fragColor; -} -else // if dist < threshold no fogging at all -{ - -// blue Rayleigh scattering with distance - -float rShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt-340000.0) + 0.1; -float lightIntensity = length(diffuse_term.rgb)/1.73 * rShade; -vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; -float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); - -if ((quality_level>5) && (tquality_level>5)) - { - fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); - } - -gl_FragColor = fragColor; -} - - - } diff --git a/Shaders/hazes.frag b/Shaders/hazes.frag index 03599dd4d..24026be78 100644 --- a/Shaders/hazes.frag +++ b/Shaders/hazes.frag @@ -54,11 +54,11 @@ else float rayleigh_in_func(in float dist, in float air_pollution, in float avisibility, in float eye_alt, in float vertex_alt) { -float fade_length = avisibility * (2.5 - 2.0 * air_pollution); +float fade_length = avisibility * (2.5 - 2.2 * sqrt(air_pollution)); fade_length = fade_length / alt_factor(eye_alt, vertex_alt); -return 1.0-exp(-dist/max(35000.0,fade_length)); +return 1.0-exp(-dist/max(15000.0,fade_length)); } diff --git a/Shaders/model-ALS-base.frag b/Shaders/model-ALS-base.frag index 34446dc58..cceea17da 100644 --- a/Shaders/model-ALS-base.frag +++ b/Shaders/model-ALS-base.frag @@ -141,6 +141,25 @@ void main() fragColor = color * texel + specular; +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); + +// Rayleigh color shift due to in-scattering + + if ((quality_level > 5) && (tquality_level > 5)) + { + float rShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt + 420000.0); + float lightIntensity = length(hazeColor * effective_scattering) * rShade; + vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; + float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); + fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); + } + // here comes the terrain haze model @@ -235,13 +254,7 @@ transmission = fog_func(transmission_arg, alt); 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); @@ -281,44 +294,17 @@ float shadow = mix( min(1.0 + dot(normal,lightDir),1.0), 1.0, 1.0-smoothstep(0.1 hazeColor = mix(shadow * hazeColor, hazeColor, 0.3 + 0.7* smoothstep(250000.0, 400000.0, terminator)); -// blue Rayleigh scattering with distance - -float rShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt-340000.0) + 0.1; -float lightIntensity = length(diffuse_term.rgb)/1.73 * rShade; -vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; -float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); - -if ((quality_level>5) && (tquality_level>5)) - { - fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); - } // determine the right mix of transmission and haze fragColor.rgb = mix((eqColorFactor * hazeColor * eShade) + secondary_light * fog_backscatter(avisibility), fragColor.rgb,transmission); + + +} + gl_FragColor = fragColor; -} -else // if dist < 40.0 no fogging at all -{ - -// blue Rayleigh scattering with distance - -float rShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt-340000.0) + 0.1; -float lightIntensity = length(diffuse_term.rgb)/1.73 * rShade; -vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; -float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); - -if ((quality_level>5) && (tquality_level>5)) - { - fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); - } - -gl_FragColor = fragColor; -} - - } diff --git a/Shaders/model-ALS-ultra.frag b/Shaders/model-ALS-ultra.frag index 291018d46..94a9ec40a 100644 --- a/Shaders/model-ALS-ultra.frag +++ b/Shaders/model-ALS-ultra.frag @@ -494,12 +494,16 @@ void main (void) vec3 hazeColor; + hazeColor.b = light_func(fog_lightArg-0.5, 1.330e-05, 0.264, 2.527, 1.08e-05, 1.0); + hazeColor.g = light_func(fog_lightArg-0.5, 3.931e-06, 0.264, 3.827, 7.93e-06, 1.0); + hazeColor.r = light_func(fog_lightArg-0.5, 8.305e-06, 0.161, 3.827, 3.04e-05, 1.0); + float rShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt + 420000.0); + float lightIntensity = length(hazeColor * effective_scattering) * rShade; + if (transmission< 1.0) { - hazeColor.b = light_func(fog_lightArg-0.5, 1.330e-05, 0.264, 2.527, 1.08e-05, 1.0); - hazeColor.g = light_func(fog_lightArg-0.5, 3.931e-06, 0.264, 3.827, 7.93e-06, 1.0); - hazeColor.r = light_func(fog_lightArg-0.5, 8.305e-06, 0.161, 3.827, 3.04e-05, 1.0); + if (fog_lightArg < 10.0) { @@ -529,21 +533,23 @@ void main (void) /// END fog color - fragColor = clamp(fragColor, 0.0, 1.0); - hazeColor = clamp(hazeColor, 0.0, 1.0); + fragColor = clamp(fragColor, 0.0, 1.0); + hazeColor = clamp(hazeColor, 0.0, 1.0); ///BEGIN Rayleigh fog /// - float rShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt-340000.0) + 0.1; - float lightIntensity = length(light_diffuse.rgb)/1.73 * rShade; + // Rayleigh color shift due to out-scattering + float rayleigh_length = 0.5 * avisibility * (2.5 - 1.9 * air_pollution)/alt_factor(eye_alt, eye_alt+relPos.z); + float outscatter = 1.0-exp(-dist/rayleigh_length); + fragColor.rgb = rayleigh_out_shift(fragColor.rgb,outscatter); + vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; - float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); - fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); + float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); + fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); /// END Rayleigh fog - //fragColor = fragColor * smoothstep(-0.05, 0.05, ct); fragColor.rgb = mix(eqColorFactor * hazeColor * fog_earthShade +secondary_light * fog_backscatter(avisibility), fragColor.rgb,transmission); gl_FragColor = fragColor; } diff --git a/Shaders/rock-ALS.frag b/Shaders/rock-ALS.frag old mode 100755 new mode 100644 index 9981d531a..7e2d8a0ea --- a/Shaders/rock-ALS.frag +++ b/Shaders/rock-ALS.frag @@ -475,13 +475,27 @@ if ((dist < 5000.0) && (combined_wetness>0.0)) fragColor = color * texel + specular; - + +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); // Rayleigh color shift due to out-scattering float rayleigh_length = 0.5 * avisibility * (2.5 - 1.9 * air_pollution)/alt_factor(eye_alt, eye_alt+relPos.z); float outscatter = 1.0-exp(-dist/rayleigh_length); fragColor.rgb = rayleigh_out_shift(fragColor.rgb,outscatter); +// Rayleigh color shift due to in-scattering + + float rShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt + 420000.0); + float lightIntensity = length(hazeColor * effective_scattering) * rShade; + vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; + float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); + fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); + // here comes the terrain haze model @@ -591,13 +605,9 @@ transmission = fog_func(transmission_arg, alt); 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 @@ -642,40 +652,14 @@ if (intensity > 0.0) // this needs to be a condition, because otherwise hazeColo } -// blue Rayleigh scattering with distance - -float rShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt-340000.0) + 0.1; -float lightIntensity = length(diffuse_term.rgb)/1.73 * rShade; -vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; -float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); -fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); fragColor.rgb = mix(eqColorFactor * hazeColor * eShade , fragColor.rgb,transmission); -//fragColor.rgb = intensity_perception(fragColor); +} gl_FragColor = fragColor; -} -else // if dist < threshold no fogging at all -{ -//fragColor.rgb = intensity_perception(fragColor); - -// blue Rayleigh scattering with distance - -float rShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt-340000.0) + 0.1; -float lightIntensity = length(diffuse_term.rgb)/1.73 * rShade; -vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; -float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); -fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); - -gl_FragColor = fragColor; -} - - - - } diff --git a/Shaders/runway-ALS.frag b/Shaders/runway-ALS.frag index ad7595611..2330118d8 100644 --- a/Shaders/runway-ALS.frag +++ b/Shaders/runway-ALS.frag @@ -56,12 +56,14 @@ float shadow_func (in float x, in float y, in float noise, in float dist); float Noise2D(in vec2 coord, in float wavelength); float DotNoise2D(in vec2 coord, in float wavelength, in float fractionalMaxDotSize, in float dot_density); float fog_func (in float targ, in float alt); +float alt_factor(in float eye_alt, in float vertex_alt); float light_distance_fading(in float dist); float fog_backscatter(in float avisibility); float rayleigh_in_func(in float dist, in float air_pollution, in float avisibility, in float eye_alt, in float vertex_alt); vec3 searchlight(); vec3 landing_light(in float offset); +vec3 rayleigh_out_shift(in vec3 color, in float outscatter); @@ -87,7 +89,7 @@ void main() yprime_alt = diffuse_term.a; mie_angle = gl_Color.a; - float effective_scattering = 1.0 - min(scattering, cloud_self_shading); + float effective_scattering = min(scattering, cloud_self_shading); // distance to fragment float dist = length(relPos); @@ -295,14 +297,38 @@ if ((dist < 5000.0)&& (quality_level > 3) && (wetness>0.0)) fragColor = color * texel + specular; + +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); + +// Rayleigh color shifts + + if ((quality_level > 5) && (tquality_level > 5)) + { + float rayleigh_length = 0.5 * avisibility * (2.5 - 1.9 * air_pollution)/alt_factor(eye_alt, eye_alt+relPos.z); + float outscatter = 1.0-exp(-dist/rayleigh_length); + fragColor.rgb = rayleigh_out_shift(fragColor.rgb,outscatter); +// Rayleigh color shift due to in-scattering + float rShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt + 420000.0); + float lightIntensity = length(hazeColor * effective_scattering) * rShade; + vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; + float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); + fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); + } + + + // here comes the terrain haze model float delta_z = hazeLayerAltitude - eye_alt; -if (dist > 0.04 * min(visibility,avisibility)) -//if ((gl_FragCoord.y > ylimit) || (gl_FragCoord.x < zlimit1) || (gl_FragCoord.x > zlimit2)) -//if (dist > 40.0) +if (dist > 0.04 * min(visibility,avisibility)) { alt = eye_alt; @@ -378,7 +404,7 @@ if (visibility < avisibility) transmission_arg = transmission_arg + (distance_in_layer/visibility); } // this combines the Weber-Fechner intensity - eqColorFactor = 1.0 - 0.1 * delta_zv/visibility - effective_scattering; + eqColorFactor = 1.0 - 0.1 * delta_zv/visibility - (1.0- effective_scattering); } else @@ -392,7 +418,7 @@ else transmission_arg = transmission_arg + (distance_in_layer/avisibility); } // this combines the Weber-Fechner intensity - eqColorFactor = 1.0 - 0.1 * delta_zv/avisibility - effective_scattering; + eqColorFactor = 1.0 - 0.1 * delta_zv/avisibility - (1.0 - effective_scattering); } @@ -403,13 +429,6 @@ transmission = fog_func(transmission_arg, alt); 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); // Mie-like factor @@ -451,44 +470,18 @@ if (intensity > 0.0) // this needs to be a condition, because otherwise hazeColo } hazeColor = clamp(hazeColor, 0.0, 1.0); -// blue Rayleigh scattering with distance -float rShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt-340000.0) + 0.1; -float lightIntensity = length(diffuse_term.rgb)/1.73 * rShade; -vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; -float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); - -if ((quality_level>5) && (tquality_level>5)) - { - fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); - } fragColor.rgb = mix((eqColorFactor * hazeColor * eShade)+secondary_light * fog_backscatter(avisibility), fragColor.rgb,transmission); + + + +} + + gl_FragColor = fragColor; - -} -else // if dist < threshold no fogging at all -{ - -// blue Rayleigh scattering with distance - -float rShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt-340000.0) + 0.1; -float lightIntensity = length(diffuse_term.rgb)/1.73 * rShade; -vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; -float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); - -if ((quality_level>5) && (tquality_level>5)) - { - fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); - } - -gl_FragColor = fragColor; -} - - - } diff --git a/Shaders/terrain-ALS-ultra.frag b/Shaders/terrain-ALS-ultra.frag index 79c6902ff..a68060f77 100644 --- a/Shaders/terrain-ALS-ultra.frag +++ b/Shaders/terrain-ALS-ultra.frag @@ -482,11 +482,28 @@ if ((dist < 5000.0) && (combined_wetness>0.0)) fragColor = color * texel + specular; + vec3 hazeColor; + float lightArg = (terminator-yprime_alt)/100000.0; + 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); + + // Rayleigh color shift due to out-scattering float rayleigh_length = 0.5 * avisibility * (2.5 - 1.9 * air_pollution)/alt_factor(eye_alt, eye_alt+relPos.z); float outscatter = 1.0-exp(-dist/rayleigh_length); fragColor.rgb = rayleigh_out_shift(fragColor.rgb,outscatter); +// Rayleigh color shift due to in-scattering + + float rShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt + 420000.0); + //float lightIntensity = length(diffuse_term.rgb)/1.73 * rShade; + float lightIntensity = length(hazeColor * effective_scattering) * rShade; + vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; + float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); + fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); + + // here comes the terrain haze model float delta_z = hazeLayerAltitude - eye_alt; @@ -588,13 +605,6 @@ transmission = fog_func(transmission_arg, alt); 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 @@ -639,39 +649,16 @@ if (intensity > 0.0) // this needs to be a condition, because otherwise hazeColo } -// blue Rayleigh scattering with distance -float rShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt-340000.0) + 0.1; -float lightIntensity = length(diffuse_term.rgb)/1.73 * rShade; -vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; -float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); -fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); // finally, mix fog in fragColor.rgb = mix((eqColorFactor * hazeColor * eShade)+secondary_light * fog_backscatter(avisibility) , fragColor.rgb,transmission); +} gl_FragColor = fragColor; - -} -else // if dist < threshold no fogging at all -{ - -// blue Rayleigh scattering with distance - -float rShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt-340000.0) + 0.1; -float lightIntensity = length(diffuse_term.rgb)/1.73 * rShade; -vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; -float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); -fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); - -gl_FragColor = fragColor; -} - - - } diff --git a/Shaders/terrain-ALS-ultra.vert b/Shaders/terrain-ALS-ultra.vert index 4aa999b95..8ba26114d 100644 --- a/Shaders/terrain-ALS-ultra.vert +++ b/Shaders/terrain-ALS-ultra.vert @@ -262,7 +262,7 @@ light_ambient = light_ambient * ((1.0+steepness)/2.0 * 1.2 + (1.0-steepness)/2.0 // deeper shadows when there is lots of direct light float shade_depth = 1.0 * smoothstep (0.6,0.95,ground_scattering) * (1.0-smoothstep(0.1,0.5,overcast)) * smoothstep(0.4,1.5,earthShade); - +shade_depth = 0.0; light_ambient.rgb = light_ambient.rgb * (1.0 - shade_depth); light_diffuse.rgb = light_diffuse.rgb * (1.0 + 1.2 * shade_depth); @@ -270,7 +270,7 @@ float shade_depth = 1.0 * smoothstep (0.6,0.95,ground_scattering) * (1.0-smooth // default lighting based on texture and material using the light we have just computed - diffuse_term = diffuse_color* light_diffuse; + diffuse_term = diffuse_color * light_diffuse; vec4 constant_term = gl_FrontMaterial.emission + ambient_color * (gl_LightModel.ambient + light_ambient); diff --git a/Shaders/tree-ALS.frag b/Shaders/tree-ALS.frag index c6befd8ae..0d32ece52 100644 --- a/Shaders/tree-ALS.frag +++ b/Shaders/tree-ALS.frag @@ -181,21 +181,29 @@ void main() vec4 fragColor = vec4 (gl_Color.rgb +secondary_light * light_distance_fading(dist),1.0) * texel; -// Rayleigh haze -float lightArg = (terminator-yprime_alt)/100000.0; -if ((quality_level > 5) && (tquality_level > 5)) - { - float rShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt-340000.0) + 0.1; - float shade_depth = smoothstep (0.6,0.95,ground_scattering);// * smoothstep(0.1,1.2,rShade); - float lightIntensity = ground_scattering * light_func(lightArg, 3.931e-06, 0.264, 3.827, 7.93e-06, 1.0)* rShade * (1.0 + 0.4 * shade_depth); + 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); + +// Rayleigh color shift due to in-scattering + + if ((quality_level > 5) && (tquality_level > 5)) + { + float rShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt + 420000.0); + float lightIntensity = length(hazeColor * effective_scattering) * rShade; vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; - float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); - fragColor.rgb = mix(fragColor.rgb, rayleighColor, rayleighStrength); + float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); + fragColor.rgb = mix(fragColor.rgb, rayleighColor,rayleighStrength); } + // here comes the terrain haze model @@ -306,11 +314,7 @@ transmission = tree_fog_func(transmission_arg); if (eqColorFactor < 0.2) eqColorFactor = 0.2; -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 @@ -351,14 +355,8 @@ hazeColor = intensity * normalize(mix(hazeColor, shadedFogColor, (1.0-smoothste hazeColor = clamp(hazeColor,0.0,1.0); fragColor.rgb = mix(eqColorFactor * hazeColor * eShade + secondary_light * fog_backscatter(avisibility), fragColor.rgb,transmission); -gl_FragColor = fragColor; - } -else // if dist < 40.0 no fogging at all -{ gl_FragColor = fragColor; } -} - diff --git a/Shaders/urban-ALS.frag b/Shaders/urban-ALS.frag index 56be23d73..a8944a448 100644 --- a/Shaders/urban-ALS.frag +++ b/Shaders/urban-ALS.frag @@ -57,6 +57,8 @@ uniform int cloud_shadow_flag; uniform int use_searchlight; uniform int use_landing_light; uniform int use_alt_landing_light; +uniform int gquality_level; +uniform int tquality_level; const float scale = 1.0; int linear_search_steps = 10; @@ -305,7 +307,7 @@ vec4 dust_color; float noise_1500m = Noise3D(worldPos.xyz,1500.0); float noise_2000m = Noise3D(worldPos.xyz,2000.0); -if (quality_level > 2) +if (gquality_level > 2) { // mix dust dust_color = vec4 (0.76, 0.71, 0.56, 1.0); @@ -342,19 +344,31 @@ if (quality_level > 2) vec4 p = vec4( ecPos3 + tile_size * V * (d-1.0) * depthfactor / s.z, 1.0 ); -// Rayleigh color shift due to out-scattering - float rayleigh_length = 0.5 * avisibility * (2.5 - 1.9 * air_pollution)/alt_factor(eye_alt, eye_alt+relPos.z); - float outscatter = 1.0-exp(-dist/rayleigh_length); - finalColor.rgb = rayleigh_out_shift(finalColor.rgb,outscatter); + +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); + +// Rayleigh color shifts + + if ((gquality_level > 5) && (tquality_level > 5)) + { + float rayleigh_length = 0.5 * avisibility * (2.5 - 1.9 * air_pollution)/alt_factor(eye_alt, eye_alt+relPos.z); + float outscatter = 1.0-exp(-dist/rayleigh_length); + finalColor.rgb = rayleigh_out_shift(finalColor.rgb,outscatter); // Rayleigh color shift due to in-scattering - - float rShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt-340000.0); - float lightIntensity = length(light_diffuse.rgb)/1.73 * rShade; - vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; - float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); - finalColor.rgb = mix(finalColor.rgb, rayleighColor,rayleighStrength); + float rShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt + 420000.0); + float lightIntensity = length(hazeColor * effective_scattering) * rShade; + vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; + float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); + finalColor.rgb = mix(finalColor.rgb, rayleighColor,rayleighStrength); + } // here comes the terrain haze model @@ -431,7 +445,7 @@ float eqColorFactor; if (visibility < avisibility) { - if (quality_level > 3) + if (gquality_level > 3) { transmission_arg = transmission_arg + (distance_in_layer/(1.0 * visibility + 1.0 * visibility * fogstructure * 0.06 * (noise_1500m + noise_2000m -1.0) )); @@ -446,7 +460,7 @@ if (visibility < avisibility) } else { - if (quality_level > 3) + if (gquality_level > 3) { transmission_arg = transmission_arg + (distance_in_layer/(1.0 * avisibility + 1.0 * avisibility * fogstructure * 0.06 * (noise_1500m + noise_2000m - 1.0) )); } @@ -466,13 +480,7 @@ transmission = fog_func(transmission_arg, alt); 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 diff --git a/Shaders/water-ALS-high.frag b/Shaders/water-ALS-high.frag index efe9354f9..468055d53 100644 --- a/Shaders/water-ALS-high.frag +++ b/Shaders/water-ALS-high.frag @@ -520,6 +520,13 @@ void main(void) finalColor *= vec4 (ambient_light.rgb + secondary_light * light_distance_fading(dist), ambient_light.a); + 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); + // Rayleigh color shift due to out-scattering @@ -535,12 +542,15 @@ void main(void) // Rayleigh color shift due to in-scattering - float rShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt-340000.0); - float lightIntensity = length(gl_Color.rgb)/1.73 * rShade; + if ((quality_level > 5) && (tquality_level > 5)) + { + float rShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt+420000.0); + //float lightIntensity = length(gl_Color.rgb* gl_FrontMaterial.diffuse.rgb)/1.73 * rShade; + float lightIntensity = length(hazeColor * effective_scattering) * rShade; vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * lightIntensity; float rayleighStrength = rayleigh_in_func(dist, air_pollution, avisibility/max(lightIntensity,0.05), eye_alt, eye_alt + relPos.z); - if ((quality_level > 5) && (tquality_level > 5)) - {finalColor.rgb = mix(finalColor.rgb, rayleighColor, rayleighStrength);} + finalColor.rgb = mix(finalColor.rgb, rayleighColor, rayleighStrength); + } // here comes the terrain haze model @@ -645,12 +655,7 @@ transmission = fog_func(transmission_arg, eye_alt); 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 float eShade = 1.0 - 0.9 * smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt); diff --git a/Shaders/water-ALS.vert b/Shaders/water-ALS.vert index 8f8730d59..22984ae84 100644 --- a/Shaders/water-ALS.vert +++ b/Shaders/water-ALS.vert @@ -241,7 +241,7 @@ else // the faster, full-day version without lightfields float shade_depth = 1.0 * smoothstep (0.6,0.95,ground_scattering) * (1.0-smoothstep(0.1,0.5,overcast)) * smoothstep(0.4,1.5,earthShade); - specular_light.rgb *= (1.0 + 1.2 * shade_depth); + specular_light.rgb *= (1.0 + 1.2 * shade_depth); yprime_alt = -sqrt(2.0 * EarthRadius * hazeLayerAltitude);