Fix unexplained shader issue (glsl compiler bug??) (#4757)
authorRogier-5 <rogier777@gmail.com>
Wed, 16 Nov 2016 16:56:05 +0000 (17:56 +0100)
committerZeno- <kde.psych@gmail.com>
Wed, 16 Nov 2016 16:56:05 +0000 (02:56 +1000)
client/shaders/nodes_shader/opengl_fragment.glsl
client/shaders/water_surface_shader/opengl_fragment.glsl
client/shaders/wielded_shader/opengl_fragment.glsl

index 4d9ce1c12dfbe80fbc1388d815d732db8f97d008..149aa2bc5b72be7df39b767000fd85f4a47d6208 100644 (file)
@@ -19,6 +19,8 @@ bool normalTexturePresent = false;
 
 const float e = 2.718281828459;
 const float BS = 10.0;
+const float fogStart = 0.4;
+const float fogShadingParameter = 1 / ( 1 - fogStart);
 
 #ifdef ENABLE_TONE_MAPPING
 
@@ -199,8 +201,18 @@ void main(void)
 #endif
 
        if (fogDistance != 0.0) {
-               float d = clamp((fogDistance - length(eyeVec)) / (fogDistance * 0.6), 0.0, 1.0);
-               col = mix(skyBgColor, col, d);
+               // Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?),
+               // the fog will only be rendered correctly if the last operation before the
+               // clamp() is an addition. Else, the clamp() seems to be ignored.
+               // E.g. the following won't work:
+               //      float clarity = clamp(fogShadingParameter
+               //              * (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0);
+               // As additions usually come for free following a multiplication, the new formula
+               // should be more efficient as well.
+               // Note: clarity = (1 - fogginess)
+               float clarity = clamp(fogShadingParameter
+                       - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0);
+               col = mix(skyBgColor, col, clarity);
        }
        col = vec4(col.rgb, base.a);
 
index b4c0cc4f819e9daeea7064e8a2795ab32f0b896b..4164870c75abda693f2053f6e07cf30249673a9b 100644 (file)
@@ -21,6 +21,8 @@ bool texSeamless = false;
 
 const float e = 2.718281828459;
 const float BS = 10.0;
+const float fogStart = 0.4;
+const float fogShadingParameter = 1 / ( 1 - fogStart);
 
 #ifdef ENABLE_TONE_MAPPING
 
@@ -155,8 +157,18 @@ vec4 base = texture2D(baseTexture, uv).rgba;
 #endif
 
        if (fogDistance != 0.0) {
-               float d = clamp((fogDistance - length(eyeVec)) / (fogDistance * 0.6), 0.0, 1.0);
-               col = mix(skyBgColor, col, d);
+               // Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?),
+               // the fog will only be rendered correctly if the last operation before the
+               // clamp() is an addition. Else, the clamp() seems to be ignored.
+               // E.g. the following won't work:
+               //      float clarity = clamp(fogShadingParameter
+               //              * (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0);
+               // As additions usually come for free following a multiplication, the new formula
+               // should be more efficient as well.
+               // Note: clarity = (1 - fogginess)
+               float clarity = clamp(fogShadingParameter
+                       - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0);
+               col = mix(skyBgColor, col, clarity);
        }
        col = vec4(col.rgb, base.a);
 
index bd97414419594ac31033ed465cbb91a24345b619..7c38b749a61b04f5297eb4989c550822e8c9497b 100644 (file)
@@ -19,6 +19,8 @@ bool texSeamless = false;
 
 const float e = 2.718281828459;
 const float BS = 10.0;
+const float fogStart = 0.4;
+const float fogShadingParameter = 1 / ( 1 - fogStart);
 
 void get_texture_flags()
 {
@@ -107,8 +109,18 @@ void main(void)
        vec4 col = vec4(color.rgb, base.a);
        col *= gl_Color;
        if (fogDistance != 0.0) {
-               float d = clamp((fogDistance - length(eyeVec)) / (fogDistance * 0.6), 0.0, 1.0);
-               col = mix(skyBgColor, col, d);
+               // Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?),
+               // the fog will only be rendered correctly if the last operation before the
+               // clamp() is an addition. Else, the clamp() seems to be ignored.
+               // E.g. the following won't work:
+               //      float clarity = clamp(fogShadingParameter
+               //              * (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0);
+               // As additions usually come for free following a multiplication, the new formula
+               // should be more efficient as well.
+               // Note: clarity = (1 - fogginess)
+               float clarity = clamp(fogShadingParameter
+                       - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0);
+               col = mix(skyBgColor, col, clarity);
        }
        gl_FragColor = vec4(col.rgb, base.a);
 }