diff --git a/Compositor/Effects/model-default.eff b/Compositor/Effects/model-default.eff index 72e1c2abc..6cb77c73f 100644 --- a/Compositor/Effects/model-default.eff +++ b/Compositor/Effects/model-default.eff @@ -473,7 +473,7 @@ vertex-program-two-side - Shaders/ALS/generic-base.vert + Shaders/ALS/model-base.vert Shaders/ALS/shadows-include.vert Shaders/ALS/model-base.frag Shaders/ALS/hazes.frag diff --git a/Compositor/Effects/model-interior-display.eff b/Compositor/Effects/model-interior-display.eff index 5c993b362..f87b158b9 100644 --- a/Compositor/Effects/model-interior-display.eff +++ b/Compositor/Effects/model-interior-display.eff @@ -69,7 +69,7 @@ vertex-program-two-side - Shaders/ALS/generic-base.vert + Shaders/ALS/model-base.vert Shaders/ALS/model-interior-base.frag Shaders/ALS/hazes.frag Shaders/ALS/secondary_lights.frag diff --git a/Compositor/Effects/model-interior.eff b/Compositor/Effects/model-interior.eff index 225fc2e80..57395eac8 100644 --- a/Compositor/Effects/model-interior.eff +++ b/Compositor/Effects/model-interior.eff @@ -742,7 +742,7 @@ vertex-program-two-side - Shaders/ALS/generic-base.vert + Shaders/ALS/model-base.vert Shaders/ALS/model-interior-base.frag Shaders/ALS/hazes.frag Shaders/ALS/secondary_lights.frag diff --git a/Compositor/Effects/terrain-default.eff b/Compositor/Effects/terrain-default.eff index 95b9db10b..8ef3168bb 100644 --- a/Compositor/Effects/terrain-default.eff +++ b/Compositor/Effects/terrain-default.eff @@ -2108,7 +2108,7 @@ - Shaders/ALS/generic-base.vert + Shaders/ALS/terrain-base.vert Shaders/ALS/shadows-include.vert Shaders/ALS/terrain-base.frag Shaders/ALS/hazes.frag diff --git a/Compositor/Shaders/ALS/3dcloud-detailed.vert b/Compositor/Shaders/ALS/3dcloud-detailed.vert index 946d06023..fa9b69959 100644 --- a/Compositor/Shaders/ALS/3dcloud-detailed.vert +++ b/Compositor/Shaders/ALS/3dcloud-detailed.vert @@ -1,6 +1,8 @@ // -*-C++-*- #version 120 +uniform float fg_Fcoef; + varying float fogFactor; varying vec3 hazeColor; varying float mie_frag; @@ -151,7 +153,8 @@ void main(void) // Final position of the sprite vec3 relVector = gl_Position.xyz - ep.xyz; gl_Position = gl_ModelViewProjectionMatrix * gl_Position; - + // logarithmic depth + gl_Position.z = (log2(max(1e-6, 1.0 + gl_Position.w)) * fg_Fcoef - 1.0) * gl_Position.w; // Light at the final position diff --git a/Compositor/Shaders/ALS/3dcloud.vert b/Compositor/Shaders/ALS/3dcloud.vert index e698f4f90..a56b4b7fb 100644 --- a/Compositor/Shaders/ALS/3dcloud.vert +++ b/Compositor/Shaders/ALS/3dcloud.vert @@ -1,6 +1,8 @@ // -*-C++-*- #version 120 +uniform float fg_Fcoef; + varying float fogFactor; varying vec3 hazeColor; @@ -134,7 +136,8 @@ void main(void) // Final position of the sprite vec3 relVector = gl_Position.xyz - ep.xyz; gl_Position = gl_ModelViewProjectionMatrix * gl_Position; - + // logarithmic depth + gl_Position.z = (log2(max(1e-6, 1.0 + gl_Position.w)) * fg_Fcoef - 1.0) * gl_Position.w; // Light at the final position diff --git a/Compositor/Shaders/ALS/agriculture.frag b/Compositor/Shaders/ALS/agriculture.frag index ad132b962..552dca805 100644 --- a/Compositor/Shaders/ALS/agriculture.frag +++ b/Compositor/Shaders/ALS/agriculture.frag @@ -12,6 +12,7 @@ varying vec3 worldPos; varying vec3 ecViewdir; +uniform float fg_Fcoef; uniform sampler2D texture; uniform sampler2D mix_texture; @@ -22,6 +23,8 @@ uniform sampler2D gradient_texture; varying float steepness; varying vec2 grad_dir; +varying float flogz; + uniform float visibility; uniform float avisibility; @@ -658,6 +661,6 @@ fragColor.rgb = mix(hazeColor + secondary_light * fog_backscatter(mvisibility), fragColor.rgb = filter_combined(fragColor.rgb); gl_FragColor = fragColor; - +gl_FragDepth = log2(flogz) * fg_Fcoef * 0.5; } diff --git a/Compositor/Shaders/ALS/airfield.frag b/Compositor/Shaders/ALS/airfield.frag index 753ed0555..b51dacc8d 100644 --- a/Compositor/Shaders/ALS/airfield.frag +++ b/Compositor/Shaders/ALS/airfield.frag @@ -11,12 +11,16 @@ varying vec2 rawPos; varying vec3 ecViewdir; +uniform float fg_Fcoef; + uniform sampler2D texture; uniform sampler2D overlay_texture; uniform sampler2D grain_texture; varying float steepness; +varying float flogz; + uniform float visibility; uniform float avisibility; @@ -520,6 +524,6 @@ fragColor.rgb = mix(hazeColor+secondary_light * fog_backscatter(mvisibility), fr fragColor.rgb = filter_combined(fragColor.rgb); gl_FragColor = fragColor; - +gl_FragDepth = log2(flogz) * fg_Fcoef * 0.5; } diff --git a/Compositor/Shaders/ALS/cliffs.frag b/Compositor/Shaders/ALS/cliffs.frag index 956b93159..f1a892648 100644 --- a/Compositor/Shaders/ALS/cliffs.frag +++ b/Compositor/Shaders/ALS/cliffs.frag @@ -16,6 +16,10 @@ varying vec3 ecViewdir; varying float steepness; varying vec2 grad_dir; +varying float flogz; + + +uniform float fg_Fcoef; uniform float visibility; uniform float avisibility; @@ -614,7 +618,7 @@ fragColor.rgb = mix(hazeColor + secondary_light * fog_backscatter(mvisibility), fragColor.rgb = filter_combined(fragColor.rgb); gl_FragColor = fragColor; - +gl_FragDepth = log2(flogz) * fg_Fcoef * 0.5; } diff --git a/Compositor/Shaders/ALS/drunway.frag b/Compositor/Shaders/ALS/drunway.frag index cc816c840..07ae0033f 100644 --- a/Compositor/Shaders/ALS/drunway.frag +++ b/Compositor/Shaders/ALS/drunway.frag @@ -10,6 +10,8 @@ varying vec2 rawPos; varying vec3 ecViewdir; +uniform float fg_Fcoef; + uniform sampler2D texture; uniform sampler2D NormalTex; uniform sampler2D mix_texture; @@ -17,6 +19,8 @@ uniform sampler2D grain_texture; varying float steepness; +varying float flogz; + uniform float visibility; uniform float avisibility; @@ -499,6 +503,6 @@ fragColor.rgb = mix(hazeColor +secondary_light * fog_backscatter(mvisibility) , fragColor.rgb = filter_combined(fragColor.rgb); gl_FragColor = fragColor; - +gl_FragDepth = log2(flogz) * fg_Fcoef * 0.5; } diff --git a/Compositor/Shaders/ALS/model-base.vert b/Compositor/Shaders/ALS/model-base.vert new file mode 100644 index 000000000..963c4ca87 --- /dev/null +++ b/Compositor/Shaders/ALS/model-base.vert @@ -0,0 +1,254 @@ +// -*-C++-*- +#version 120 + +// Shader that uses OpenGL state values to do per-pixel lighting +// +// The only light used is gl_LightSource[0], which is assumed to be +// directional. +// +// Diffuse colors come from the gl_Color, ambient from the material. This is +// equivalent to osg::Material::DIFFUSE. +// Haze part added by Thorsten Renk, Oct. 2011 + + +#define MODE_OFF 0 +#define MODE_DIFFUSE 1 +#define MODE_AMBIENT_AND_DIFFUSE 2 + +uniform float fg_Fcoef; + +// The constant term of the lighting equation that doesn't depend on +// the surface normal is passed in gl_{Front,Back}Color. The alpha +// component is set to 1 for front, 0 for back in order to work around +// bugs with gl_FrontFacing in the fragment shader. +varying vec4 diffuse_term; +varying vec3 normal; +varying vec3 relPos; +varying vec4 ecPosition; + +varying float yprime_alt; +varying float mie_angle; + +uniform int colorMode; +uniform float hazeLayerAltitude; +uniform float terminator; +uniform float terrain_alt; +uniform float avisibility; +uniform float visibility; +uniform float overcast; +uniform float ground_scattering; +uniform float moonlight; + + +void setupShadows(vec4 eyeSpacePos); + +// This is the value used in the skydome scattering shader - use the same here for consistency? +const float EarthRadius = 5800000.0; +const float terminator_width = 200000.0; + + +float earthShade; + +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 < -15.0) {return 0.0;} + +return e / pow((1.0 + a * exp(-b * (x-c)) ),(1.0/d)); +} + + +void main() +{ + + vec4 light_diffuse; + vec4 light_ambient; + vec3 shadedFogColor = vec3(0.55, 0.67, 0.88); + vec3 moonLightColor = vec3 (0.095, 0.095, 0.15) * moonlight; + + + //float yprime_alt; + float yprime; + float lightArg; + float intensity; + float vertex_alt; + float scattering; + +// this code is copied from default.vert + + ecPosition = gl_ModelViewMatrix * gl_Vertex; + gl_Position = ftransform(); + // logarithmic depth + gl_Position.z = (log2(max(1e-6, 1.0 + gl_Position.w)) * fg_Fcoef - 1.0) * gl_Position.w; + gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; + normal = gl_NormalMatrix * gl_Normal; + vec4 ambient_color, diffuse_color; + if (colorMode == MODE_DIFFUSE) { + diffuse_color = gl_Color; + ambient_color = gl_FrontMaterial.ambient; + } else if (colorMode == MODE_AMBIENT_AND_DIFFUSE) { + diffuse_color = gl_Color; + ambient_color = gl_Color; + } else { + diffuse_color = gl_FrontMaterial.diffuse; + ambient_color = gl_FrontMaterial.ambient; + } + + + + // here start computations for the haze layer + // we need several geometrical quantities + + // first current altitude of eye position in model space + vec4 ep = gl_ModelViewMatrixInverse * vec4(0.0,0.0,0.0,1.0); + + // and relative position to vector + relPos = gl_Vertex.xyz - ep.xyz; + + // unfortunately, we need the distance in the vertex shader, although the more accurate version + // is later computed in the fragment shader again + float dist = length(relPos); + + // altitude of the vertex in question, somehow zero leads to artefacts, so ensure it is at least 100m + vertex_alt = max(gl_Vertex.z,100.0); + scattering = ground_scattering + (1.0 - ground_scattering) * smoothstep(hazeLayerAltitude -100.0, hazeLayerAltitude + 100.0, vertex_alt); + + + // branch dependent on daytime + +if (terminator < 1000000.0) // the full, sunrise and sunset computation +{ + + + // establish coordinates relative to sun position + + vec3 lightFull = (gl_ModelViewMatrixInverse * gl_LightSource[0].position).xyz; + vec3 lightHorizon = normalize(vec3(lightFull.x,lightFull.y, 0.0)); + + + + // yprime is the distance of the vertex into sun direction + yprime = -dot(relPos, lightHorizon); + + // this gets an altitude correction, higher terrain gets to see the sun earlier + yprime_alt = yprime - sqrt(2.0 * EarthRadius * vertex_alt); + + // two times terminator width governs how quickly light fades into shadow + // now the light-dimming factor + earthShade = 0.6 * (1.0 - smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt)) + 0.4; + + // parametrized version of the Flightgear ground lighting function + lightArg = (terminator-yprime_alt)/100000.0; + + // directional scattering for low sun + if (lightArg < 10.0) + {mie_angle = (0.5 * dot(normalize(relPos), normalize(lightFull)) ) + 0.5;} + else + {mie_angle = 1.0;} + + + + + light_diffuse.b = light_func(lightArg, 1.330e-05, 0.264, 3.827, 1.08e-05, 1.0); + light_diffuse.g = light_func(lightArg, 3.931e-06, 0.264, 3.827, 7.93e-06, 1.0); + light_diffuse.r = light_func(lightArg, 8.305e-06, 0.161, 3.827, 3.04e-05, 1.0); + light_diffuse.a = 1.0; + light_diffuse = light_diffuse * scattering; + + + light_ambient.r = light_func(lightArg, 0.236, 0.253, 1.073, 0.572, 0.33); + light_ambient.g = light_ambient.r * 0.4/0.33; + light_ambient.b = light_ambient.r * 0.5/0.33; + light_ambient.a = 1.0; + + + + +// correct ambient light intensity and hue before sunrise +if (earthShade < 0.5) + { + //light_ambient = light_ambient * (0.7 + 0.3 * smoothstep(0.2, 0.5, earthShade)); + intensity = length(light_ambient.xyz); + + light_ambient.rgb = intensity * normalize(mix(light_ambient.rgb, shadedFogColor, 1.0 -smoothstep(0.4, 0.8,earthShade) )); + light_ambient.rgb = light_ambient.rgb + moonLightColor * (1.0 - smoothstep(0.4, 0.5, earthShade)); + + intensity = length(light_diffuse.xyz); + light_diffuse.rgb = intensity * normalize(mix(light_diffuse.rgb, shadedFogColor, 1.0 -smoothstep(0.4, 0.7,earthShade) )); + } + + +// the haze gets the light at the altitude of the haze top if the vertex in view is below +// but the light at the vertex if the vertex is above + +vertex_alt = max(vertex_alt,hazeLayerAltitude); + +if (vertex_alt > hazeLayerAltitude) + { + if (dist > 0.8 * avisibility) + { + vertex_alt = mix(vertex_alt, hazeLayerAltitude, smoothstep(0.8*avisibility, avisibility, dist)); + yprime_alt = yprime -sqrt(2.0 * EarthRadius * vertex_alt); + } + } +else + { + vertex_alt = hazeLayerAltitude; + yprime_alt = yprime -sqrt(2.0 * EarthRadius * vertex_alt); + } + +} +else // the faster, full-day version without lightfields +{ + //vertex_alt = max(gl_Vertex.z,100.0); + + earthShade = 1.0; + mie_angle = 1.0; + + if (terminator > 3000000.0) + {light_diffuse = vec4 (1.0, 1.0, 1.0, 0.0); + light_ambient = vec4 (0.33, 0.4, 0.5, 0.0); } + else + { + + lightArg = (terminator/100000.0 - 10.0)/20.0; + light_diffuse.b = 0.78 + lightArg * 0.21; + light_diffuse.g = 0.907 + lightArg * 0.091; + light_diffuse.r = 0.904 + lightArg * 0.092; + light_diffuse.a = 1.0; + + light_ambient.r = 0.316 + lightArg * 0.016; + light_ambient.g = light_ambient.r * 0.4/0.33; + light_ambient.b = light_ambient.r * 0.5/0.33; + light_ambient.a = 1.0; + } + + light_diffuse = light_diffuse * scattering; + yprime_alt = -sqrt(2.0 * EarthRadius * hazeLayerAltitude); +} + + +// default lighting based on texture and material using the light we have just computed + + diffuse_term = diffuse_color* light_diffuse; + vec4 constant_term = gl_FrontMaterial.emission + ambient_color * + (gl_LightModel.ambient + light_ambient); + // Super hack: if diffuse material alpha is less than 1, assume a + // transparency animation is at work + if (gl_FrontMaterial.diffuse.a < 1.0) + diffuse_term.a = gl_FrontMaterial.diffuse.a; + else + diffuse_term.a = gl_Color.a; + // Another hack for supporting two-sided lighting without using + // gl_FrontFacing in the fragment shader. + gl_FrontColor.rgb = constant_term.rgb; gl_FrontColor.a = 1.0; + gl_BackColor.rgb = constant_term.rgb; gl_BackColor.a = 0.0; + + setupShadows(gl_ModelViewMatrix * gl_Vertex); +} + + + + diff --git a/Compositor/Shaders/ALS/model-interior-detailed.vert b/Compositor/Shaders/ALS/model-interior-detailed.vert index 8010c8650..e7ae64eb5 100644 --- a/Compositor/Shaders/ALS/model-interior-detailed.vert +++ b/Compositor/Shaders/ALS/model-interior-detailed.vert @@ -15,6 +15,8 @@ #define MODE_DIFFUSE 1 #define MODE_AMBIENT_AND_DIFFUSE 2 +uniform float fg_Fcoef; + // The constant term of the lighting equation that doesn't depend on // the surface normal is passed in gl_{Front,Back}Color. The alpha // component is set to 1 for front, 0 for back in order to work around @@ -85,6 +87,8 @@ void main() //vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex; gl_Position = ftransform(); + // logarithmic depth + gl_Position.z = (log2(max(1e-6, 1.0 + gl_Position.w)) * fg_Fcoef - 1.0) * gl_Position.w; gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; normal = gl_NormalMatrix * gl_Normal; vec4 ambient_color, diffuse_color; diff --git a/Compositor/Shaders/ALS/model-ultra.vert b/Compositor/Shaders/ALS/model-ultra.vert index 844aadf99..fd313c77a 100644 --- a/Compositor/Shaders/ALS/model-ultra.vert +++ b/Compositor/Shaders/ALS/model-ultra.vert @@ -16,6 +16,8 @@ varying float alpha; attribute vec3 tangent; attribute vec3 binormal; +uniform float fg_Fcoef; + uniform float pitch; uniform float roll; uniform float hdg; @@ -113,6 +115,8 @@ void main(void) * (gl_LightModel.ambient + gl_LightSource[0].ambient); gl_Position = ftransform(); + // logarithmic depth + gl_Position.z = (log2(max(1e-6, 1.0 + gl_Position.w)) * fg_Fcoef - 1.0) * gl_Position.w; gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; setupShadows(ecPosition); diff --git a/Compositor/Shaders/ALS/rock.frag b/Compositor/Shaders/ALS/rock.frag index 170e1bbb5..026c97559 100644 --- a/Compositor/Shaders/ALS/rock.frag +++ b/Compositor/Shaders/ALS/rock.frag @@ -15,6 +15,10 @@ varying vec3 ecViewdir; varying float steepness; varying vec2 grad_dir; +varying float flogz; + + +uniform float fg_Fcoef; uniform float visibility; uniform float avisibility; @@ -673,7 +677,7 @@ fragColor.rgb = mix(hazeColor + secondary_light * fog_backscatter(mvisibility), fragColor.rgb = filter_combined(fragColor.rgb); gl_FragColor = fragColor; - +gl_FragDepth = log2(flogz) * fg_Fcoef * 0.5; } diff --git a/Compositor/Shaders/ALS/runway.frag b/Compositor/Shaders/ALS/runway.frag index 06e600676..b6656ccb4 100644 --- a/Compositor/Shaders/ALS/runway.frag +++ b/Compositor/Shaders/ALS/runway.frag @@ -11,11 +11,15 @@ varying vec3 worldPos; varying vec3 ecViewdir; +uniform float fg_Fcoef; + uniform sampler2D texture; uniform sampler2D NormalTex; varying float steepness; +varying float flogz; + uniform float visibility; uniform float avisibility; @@ -526,7 +530,7 @@ fragColor.rgb = mix(hazeColor +secondary_light * fog_backscatter(mvisibility), f fragColor.rgb = filter_combined(fragColor.rgb); gl_FragColor = fragColor; - +gl_FragDepth = log2(flogz) * fg_Fcoef * 0.5; } diff --git a/Compositor/Shaders/ALS/skydome.vert b/Compositor/Shaders/ALS/skydome.vert index 303106a8b..91798e86a 100644 --- a/Compositor/Shaders/ALS/skydome.vert +++ b/Compositor/Shaders/ALS/skydome.vert @@ -5,7 +5,8 @@ // Atmospheric scattering shader for flightgear // Written by Lauri Peltonen (Zan) // Implementation of O'Neil's algorithm - + +uniform float fg_Fcoef; uniform mat4 osg_ViewMatrix; uniform mat4 osg_ViewMatrixInverse; @@ -295,4 +296,6 @@ void main() // Transform gl_Position = gl_ModelViewProjectionMatrix * finalVertex; + // logarithmic depth + gl_Position.z = (log2(max(1e-6, 1.0 + gl_Position.w)) * fg_Fcoef - 1.0) * gl_Position.w; } diff --git a/Compositor/Shaders/ALS/terrain-base.frag b/Compositor/Shaders/ALS/terrain-base.frag index d50d4126e..cdfcd1e00 100644 --- a/Compositor/Shaders/ALS/terrain-base.frag +++ b/Compositor/Shaders/ALS/terrain-base.frag @@ -8,12 +8,16 @@ varying vec3 normal; varying vec3 relPos; +uniform float fg_Fcoef; + uniform sampler2D texture; varying float yprime_alt; varying float mie_angle; +varying float flogz; + uniform float visibility; uniform float avisibility; @@ -245,6 +249,6 @@ fragColor.rgb = mix(hazeColor, fragColor.rgb,transmission); fragColor.rgb = filter_combined(fragColor.rgb); gl_FragColor = fragColor; - +gl_FragDepth = log2(flogz) * fg_Fcoef * 0.5; } diff --git a/Compositor/Shaders/ALS/generic-base.vert b/Compositor/Shaders/ALS/terrain-base.vert similarity index 98% rename from Compositor/Shaders/ALS/generic-base.vert rename to Compositor/Shaders/ALS/terrain-base.vert index 6895e834b..e52450c0f 100644 --- a/Compositor/Shaders/ALS/generic-base.vert +++ b/Compositor/Shaders/ALS/terrain-base.vert @@ -27,6 +27,8 @@ varying vec4 ecPosition; varying float yprime_alt; varying float mie_angle; +varying float flogz; + uniform int colorMode; uniform float hazeLayerAltitude; uniform float terminator; @@ -78,6 +80,8 @@ void main() ecPosition = gl_ModelViewMatrix * gl_Vertex; gl_Position = ftransform(); + // logarithmic depth + flogz = 1.0 + gl_Position.w; gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; normal = gl_NormalMatrix * gl_Normal; vec4 ambient_color, diffuse_color; diff --git a/Compositor/Shaders/ALS/terrain-detailed.frag b/Compositor/Shaders/ALS/terrain-detailed.frag index 82368bef4..4176531f8 100644 --- a/Compositor/Shaders/ALS/terrain-detailed.frag +++ b/Compositor/Shaders/ALS/terrain-detailed.frag @@ -10,6 +10,7 @@ varying vec2 rawPos; varying vec3 worldPos; +uniform float fg_Fcoef; uniform sampler2D texture; uniform sampler2D detail_texture; @@ -19,6 +20,8 @@ uniform sampler2D mix_texture; //varying float mie_angle; varying float steepness; +varying float flogz; + uniform float visibility; uniform float avisibility; @@ -501,7 +504,7 @@ fragColor.rgb = mix(clamp(hazeColor,0.0,1.0) , clamp(fragColor.rgb,0.0,1.0),tran fragColor.rgb = filter_combined(fragColor.rgb); gl_FragColor = fragColor; - +gl_FragDepth = log2(flogz) * fg_Fcoef * 0.5; } diff --git a/Compositor/Shaders/ALS/terrain-detailed.vert b/Compositor/Shaders/ALS/terrain-detailed.vert index 5bdaa4470..0162fedf8 100644 --- a/Compositor/Shaders/ALS/terrain-detailed.vert +++ b/Compositor/Shaders/ALS/terrain-detailed.vert @@ -29,6 +29,8 @@ varying vec3 worldPos; varying float mie_angle; varying float steepness; +varying float flogz; + uniform int colorMode; uniform float hazeLayerAltitude; @@ -94,6 +96,8 @@ void main() //vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex; gl_Position = ftransform(); + // logarithmic depth + flogz = 1.0 + gl_Position.w; gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; normal = gl_NormalMatrix * gl_Normal; //nvec = (gl_NormalMatrix * gl_Normal).xy; diff --git a/Compositor/Shaders/ALS/terrain-ultra.frag b/Compositor/Shaders/ALS/terrain-ultra.frag index a72393771..136c2168b 100644 --- a/Compositor/Shaders/ALS/terrain-ultra.frag +++ b/Compositor/Shaders/ALS/terrain-ultra.frag @@ -12,6 +12,8 @@ varying vec3 ecViewdir; varying vec2 grad_dir; +uniform float fg_Fcoef; + uniform sampler2D texture; uniform sampler2D detail_texture; uniform sampler2D mix_texture; @@ -22,7 +24,7 @@ uniform sampler2D gradient_texture; varying float steepness; - +varying float flogz; uniform float visibility; uniform float avisibility; @@ -664,6 +666,6 @@ fragColor.rgb = mix(hazeColor+secondary_light * fog_backscatter(mvisibility) , f fragColor.rgb = filter_combined(fragColor.rgb); gl_FragColor = fragColor; - +gl_FragDepth = log2(flogz) * fg_Fcoef * 0.5; } diff --git a/Compositor/Shaders/ALS/terrain-ultra.vert b/Compositor/Shaders/ALS/terrain-ultra.vert index 2d5ef969c..3523a6e1e 100644 --- a/Compositor/Shaders/ALS/terrain-ultra.vert +++ b/Compositor/Shaders/ALS/terrain-ultra.vert @@ -30,6 +30,8 @@ varying vec2 grad_dir; varying float mie_angle; varying float steepness; +varying float flogz; + uniform int colorMode; uniform bool raise_vertex; @@ -104,6 +106,8 @@ void main() gl_Position = gl_ModelViewProjectionMatrix * pos; } else gl_Position = ftransform(); + // logarithmic depth + flogz = 1.0 + gl_Position.w; // this code is copied from default.vert diff --git a/Compositor/Shaders/ALS/tree-shadow.vert b/Compositor/Shaders/ALS/tree-shadow.vert index 979353d5f..b2cb49f2f 100644 --- a/Compositor/Shaders/ALS/tree-shadow.vert +++ b/Compositor/Shaders/ALS/tree-shadow.vert @@ -15,6 +15,8 @@ #define MODE_DIFFUSE 1 #define MODE_AMBIENT_AND_DIFFUSE 2 +uniform float fg_Fcoef; + // The constant term of the lighting equation that doesn't depend on // the surface normal is passed in gl_{Front,Back}Color. The alpha // component is set to 1 for front, 0 for back in order to work around @@ -215,6 +217,8 @@ void main() // Move to correct location (stored in gl_Color) position = position + gl_Color.xyz; gl_Position = gl_ModelViewProjectionMatrix * vec4(position,1.0); + // logarithmic depth + gl_Position.z = (log2(max(1e-6, 1.0 + gl_Position.w)) * fg_Fcoef - 1.0) * gl_Position.w; vec3 ecPosition = vec3(gl_ModelViewMatrix * vec4(position, 1.0)); //normal = normalize(-ecPosition); diff --git a/Compositor/Shaders/ALS/tree.vert b/Compositor/Shaders/ALS/tree.vert index 5474f3b9f..1c8511562 100644 --- a/Compositor/Shaders/ALS/tree.vert +++ b/Compositor/Shaders/ALS/tree.vert @@ -15,6 +15,8 @@ #define MODE_DIFFUSE 1 #define MODE_AMBIENT_AND_DIFFUSE 2 +uniform float fg_Fcoef; + // The constant term of the lighting equation that doesn't depend on // the surface normal is passed in gl_{Front,Back}Color. The alpha // component is set to 1 for front, 0 for back in order to work around @@ -130,6 +132,8 @@ void main() // Move to correct location (stored in gl_Color) position = position + gl_Color.xyz; gl_Position = gl_ModelViewProjectionMatrix * vec4(position,1.0); + // logarithmic depth + gl_Position.z = (log2(max(1e-6, 1.0 + gl_Position.w)) * fg_Fcoef - 1.0) * gl_Position.w; vec3 ecPosition = vec3(gl_ModelViewMatrix * vec4(position, 1.0)); //normal = normalize(-ecPosition); diff --git a/Compositor/Shaders/ALS/urban.vert b/Compositor/Shaders/ALS/urban.vert index 0eb8546f1..75a6f2356 100644 --- a/Compositor/Shaders/ALS/urban.vert +++ b/Compositor/Shaders/ALS/urban.vert @@ -15,6 +15,8 @@ #define MODE_DIFFUSE 1 #define MODE_AMBIENT_AND_DIFFUSE 2 +uniform float fg_Fcoef; + // The constant term of the lighting equation that doesn't depend on // the surface normal is passed in gl_{Front,Back}Color. The alpha // component is set to 1 for front, 0 for back in order to work around @@ -105,6 +107,8 @@ void main() // this code is copied from default.vert gl_Position = ftransform(); + // logarithmic depth + gl_Position.z = (log2(max(1e-6, 1.0 + gl_Position.w)) * fg_Fcoef - 1.0) * gl_Position.w; gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; //normal = gl_NormalMatrix * gl_Normal; vec4 ambient_color, diffuse_color; diff --git a/Compositor/Shaders/ALS/water-base.frag b/Compositor/Shaders/ALS/water-base.frag index 1a5d203c1..2dcb975b8 100644 --- a/Compositor/Shaders/ALS/water-base.frag +++ b/Compositor/Shaders/ALS/water-base.frag @@ -8,6 +8,8 @@ #version 120 +uniform float fg_Fcoef; + uniform sampler2D water_normalmap; uniform sampler2D water_dudvmap; uniform sampler2D sea_foam; @@ -29,6 +31,8 @@ varying float earthShade; varying float yprime_alt; varying float mie_angle; +varying float flogz; + uniform float WaveFreq ; uniform float WaveAmp ; uniform float WaveSharp ; @@ -556,5 +560,5 @@ if (intensity > 0.0) // this needs to be a condition, because otherwise hazeColo finalColor.rgb = filter_combined(finalColor.rgb); gl_FragColor = finalColor; - + gl_FragDepth = log2(flogz) * fg_Fcoef * 0.5; } diff --git a/Compositor/Shaders/ALS/water-high.frag b/Compositor/Shaders/ALS/water-high.frag index a8d9bed00..d7150d9c7 100644 --- a/Compositor/Shaders/ALS/water-high.frag +++ b/Compositor/Shaders/ALS/water-high.frag @@ -8,6 +8,8 @@ #version 120 +uniform float fg_Fcoef; + uniform sampler2D water_normalmap; uniform sampler2D water_dudvmap; uniform sampler2D sea_foam; @@ -34,6 +36,8 @@ varying float yprime_alt; varying float mie_angle; varying float steepness; +varying float flogz; + uniform float WaveFreq ; uniform float WaveAmp ; uniform float WaveSharp ; @@ -738,6 +742,6 @@ finalColor.rgb = filter_combined(finalColor.rgb); gl_FragColor = finalColor; - +gl_FragDepth = log2(flogz) * fg_Fcoef * 0.5; } diff --git a/Compositor/Shaders/ALS/water.vert b/Compositor/Shaders/ALS/water.vert index 750bdec7d..24ebfcb0e 100644 --- a/Compositor/Shaders/ALS/water.vert +++ b/Compositor/Shaders/ALS/water.vert @@ -7,6 +7,8 @@ #version 120 +varying float flogz; + varying vec4 waterTex1; varying vec4 waterTex2; varying vec4 waterTex4; @@ -119,7 +121,8 @@ void main(void) // fog_Func(fogType); gl_Position = ftransform(); - + // logarithmic depth + flogz = 1.0 + gl_Position.w; // here start computations for the haze layer