Improved faces shading with and without shaders.
authorRealBadAngel <maciej.kasatkin@o2.pl>
Mon, 16 Jun 2014 16:51:01 +0000 (18:51 +0200)
committerRealBadAngel <maciej.kasatkin@o2.pl>
Mon, 16 Jun 2014 22:56:17 +0000 (00:56 +0200)
client/shaders/nodes_shader/opengl_fragment.glsl
client/shaders/nodes_shader/opengl_vertex.glsl
client/shaders/water_surface_shader/opengl_fragment.glsl
client/shaders/water_surface_shader/opengl_vertex.glsl
src/mapblock_mesh.cpp

index 351faf81b1b783815fe4c308cb25b2f93447029d..2a1cbc5689633deb0a0e7180db2b96b734cbac09 100644 (file)
@@ -99,12 +99,6 @@ vec4 base = texture2D(baseTexture, uv).rgba;
        float alpha = gl_Color.a;
        vec4 col = vec4(color.rgb, alpha);
        col *= gl_Color;
-       col = col * col; // SRGB -> Linear
-       col *= 1.8;
-       col.r = 1.0 - exp(1.0 - col.r) / e;
-       col.g = 1.0 - exp(1.0 - col.g) / e;
-       col.b = 1.0 - exp(1.0 - col.b) / e;
-       col = sqrt(col); // Linear -> SRGB
        if(fogDistance != 0.0){
                float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
                alpha = mix(alpha, 0.0, d);
@@ -113,12 +107,6 @@ vec4 base = texture2D(baseTexture, uv).rgba;
 #else
        vec4 col = vec4(color.rgb, base.a);
        col *= gl_Color;
-       col = col * col; // SRGB -> Linear
-       col *= 1.8;
-       col.r = 1.0 - exp(1.0 - col.r) / e;
-       col.g = 1.0 - exp(1.0 - col.g) / e;
-       col.b = 1.0 - exp(1.0 - col.b) / e;
-       col = sqrt(col); // Linear -> SRGB
        if(fogDistance != 0.0){
                float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
                col = mix(col, skyBgColor, d);
index b09d037744740370659ebfb096a47c1ca4f8ac69..88e489e6ca6e0dacd6e13045125fb60ce22f1e07 100644 (file)
@@ -63,28 +63,35 @@ void main(void)
 \r
        vec3 normal, tangent, binormal;\r
        normal = normalize(gl_NormalMatrix * gl_Normal);\r
+       float tileContrast = 1.0;\r
        if (gl_Normal.x > 0.5) {\r
                //  1.0,  0.0,  0.0\r
+               tileContrast = 0.8;\r
                tangent  = normalize(gl_NormalMatrix * vec3( 0.0,  0.0, -1.0));\r
                binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0,  0.0));\r
        } else if (gl_Normal.x < -0.5) {\r
                // -1.0,  0.0,  0.0\r
+               tileContrast = 0.8;\r
                tangent  = normalize(gl_NormalMatrix * vec3( 0.0,  0.0,  1.0));\r
                binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0,  0.0));\r
        } else if (gl_Normal.y > 0.5) {\r
                //  0.0,  1.0,  0.0\r
+               tileContrast = 1.2;\r
                tangent  = normalize(gl_NormalMatrix * vec3( 1.0,  0.0,  0.0));\r
                binormal = normalize(gl_NormalMatrix * vec3( 0.0,  0.0,  1.0));\r
        } else if (gl_Normal.y < -0.5) {\r
                //  0.0, -1.0,  0.0\r
+               tileContrast = 0.3;\r
                tangent  = normalize(gl_NormalMatrix * vec3( 1.0,  0.0,  0.0));\r
                binormal = normalize(gl_NormalMatrix * vec3( 0.0,  0.0,  1.0));\r
        } else if (gl_Normal.z > 0.5) {\r
                //  0.0,  0.0,  1.0\r
+               tileContrast = 0.5;\r
                tangent  = normalize(gl_NormalMatrix * vec3( 1.0,  0.0,  0.0));\r
                binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0,  0.0));\r
        } else if (gl_Normal.z < -0.5) {\r
                //  0.0,  0.0, -1.0\r
+               tileContrast = 0.5;\r
                tangent  = normalize(gl_NormalMatrix * vec3(-1.0,  0.0,  0.0));\r
                binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0,  0.0));\r
        }\r
@@ -108,7 +115,7 @@ void main(void)
 \r
        // Moonlight is blue\r
        b += (day - night) / 13.0;\r
-       rg -= (day - night) / 23.0;\r
+       rg -= (day - night) / 13.0;\r
 \r
        // Emphase blue a bit in darker places\r
        // See C++ implementation in mapblock_mesh.cpp finalColorBlend()\r
@@ -118,18 +125,17 @@ void main(void)
        // See C++ implementation in mapblock_mesh.cpp finalColorBlend()\r
        rg += max(0.0, (1.0 - abs(rg - 0.85)/0.15) * 0.065);\r
 \r
-       color.r = clamp(rg,0.0,1.0);\r
-       color.g = clamp(rg,0.0,1.0);\r
-       color.b = clamp(b,0.0,1.0);\r
+       color.r = rg;\r
+       color.g = rg;\r
+       color.b = b;\r
 \r
 #if !(MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT || MATERIAL_TYPE == TILE_MATERIAL_LIQUID_OPAQUE)\r
        // Make sides and bottom darker than the top\r
        color = color * color; // SRGB -> Linear\r
-       if(gl_Normal.y <= 0.5)\r
-               color *= 0.6;\r
+       color *= tileContrast;\r
        color = sqrt(color); // Linear -> SRGB\r
 #endif\r
 \r
        color.a = gl_Color.a;\r
-       gl_FrontColor = gl_BackColor = color;\r
+       gl_FrontColor = gl_BackColor = clamp(color,0.0,1.0);\r
 }\r
index 351faf81b1b783815fe4c308cb25b2f93447029d..2a1cbc5689633deb0a0e7180db2b96b734cbac09 100644 (file)
@@ -99,12 +99,6 @@ vec4 base = texture2D(baseTexture, uv).rgba;
        float alpha = gl_Color.a;
        vec4 col = vec4(color.rgb, alpha);
        col *= gl_Color;
-       col = col * col; // SRGB -> Linear
-       col *= 1.8;
-       col.r = 1.0 - exp(1.0 - col.r) / e;
-       col.g = 1.0 - exp(1.0 - col.g) / e;
-       col.b = 1.0 - exp(1.0 - col.b) / e;
-       col = sqrt(col); // Linear -> SRGB
        if(fogDistance != 0.0){
                float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
                alpha = mix(alpha, 0.0, d);
@@ -113,12 +107,6 @@ vec4 base = texture2D(baseTexture, uv).rgba;
 #else
        vec4 col = vec4(color.rgb, base.a);
        col *= gl_Color;
-       col = col * col; // SRGB -> Linear
-       col *= 1.8;
-       col.r = 1.0 - exp(1.0 - col.r) / e;
-       col.g = 1.0 - exp(1.0 - col.g) / e;
-       col.b = 1.0 - exp(1.0 - col.b) / e;
-       col = sqrt(col); // Linear -> SRGB
        if(fogDistance != 0.0){
                float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
                col = mix(col, skyBgColor, d);
index b09d037744740370659ebfb096a47c1ca4f8ac69..88e489e6ca6e0dacd6e13045125fb60ce22f1e07 100644 (file)
@@ -63,28 +63,35 @@ void main(void)
 \r
        vec3 normal, tangent, binormal;\r
        normal = normalize(gl_NormalMatrix * gl_Normal);\r
+       float tileContrast = 1.0;\r
        if (gl_Normal.x > 0.5) {\r
                //  1.0,  0.0,  0.0\r
+               tileContrast = 0.8;\r
                tangent  = normalize(gl_NormalMatrix * vec3( 0.0,  0.0, -1.0));\r
                binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0,  0.0));\r
        } else if (gl_Normal.x < -0.5) {\r
                // -1.0,  0.0,  0.0\r
+               tileContrast = 0.8;\r
                tangent  = normalize(gl_NormalMatrix * vec3( 0.0,  0.0,  1.0));\r
                binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0,  0.0));\r
        } else if (gl_Normal.y > 0.5) {\r
                //  0.0,  1.0,  0.0\r
+               tileContrast = 1.2;\r
                tangent  = normalize(gl_NormalMatrix * vec3( 1.0,  0.0,  0.0));\r
                binormal = normalize(gl_NormalMatrix * vec3( 0.0,  0.0,  1.0));\r
        } else if (gl_Normal.y < -0.5) {\r
                //  0.0, -1.0,  0.0\r
+               tileContrast = 0.3;\r
                tangent  = normalize(gl_NormalMatrix * vec3( 1.0,  0.0,  0.0));\r
                binormal = normalize(gl_NormalMatrix * vec3( 0.0,  0.0,  1.0));\r
        } else if (gl_Normal.z > 0.5) {\r
                //  0.0,  0.0,  1.0\r
+               tileContrast = 0.5;\r
                tangent  = normalize(gl_NormalMatrix * vec3( 1.0,  0.0,  0.0));\r
                binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0,  0.0));\r
        } else if (gl_Normal.z < -0.5) {\r
                //  0.0,  0.0, -1.0\r
+               tileContrast = 0.5;\r
                tangent  = normalize(gl_NormalMatrix * vec3(-1.0,  0.0,  0.0));\r
                binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0,  0.0));\r
        }\r
@@ -108,7 +115,7 @@ void main(void)
 \r
        // Moonlight is blue\r
        b += (day - night) / 13.0;\r
-       rg -= (day - night) / 23.0;\r
+       rg -= (day - night) / 13.0;\r
 \r
        // Emphase blue a bit in darker places\r
        // See C++ implementation in mapblock_mesh.cpp finalColorBlend()\r
@@ -118,18 +125,17 @@ void main(void)
        // See C++ implementation in mapblock_mesh.cpp finalColorBlend()\r
        rg += max(0.0, (1.0 - abs(rg - 0.85)/0.15) * 0.065);\r
 \r
-       color.r = clamp(rg,0.0,1.0);\r
-       color.g = clamp(rg,0.0,1.0);\r
-       color.b = clamp(b,0.0,1.0);\r
+       color.r = rg;\r
+       color.g = rg;\r
+       color.b = b;\r
 \r
 #if !(MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT || MATERIAL_TYPE == TILE_MATERIAL_LIQUID_OPAQUE)\r
        // Make sides and bottom darker than the top\r
        color = color * color; // SRGB -> Linear\r
-       if(gl_Normal.y <= 0.5)\r
-               color *= 0.6;\r
+       color *= tileContrast;\r
        color = sqrt(color); // Linear -> SRGB\r
 #endif\r
 \r
        color.a = gl_Color.a;\r
-       gl_FrontColor = gl_BackColor = color;\r
+       gl_FrontColor = gl_BackColor = clamp(color,0.0,1.0);\r
 }\r
index bf62fe8b4d24d6a8c0c16ebe70b40ba898821a2b..1f2f6cd8c43904ba31f0b2bc4c6eff52f9ac94ad 100644 (file)
@@ -1397,13 +1397,32 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
                                u8 night = j->second.second;
                                finalColorBlend(vertices[vertexIndex].Color,
                                                day, night, daynight_ratio);
-                               // Brighten topside (no shaders)
-                               if(vertices[vertexIndex].Normal.Y > 0.5)
-                               {
-                                       video::SColor &vc = vertices[vertexIndex].Color;
-                                       vc.setRed  (srgb_linear_multiply(vc.getRed(),   1.3, 255.0));
-                                       vc.setGreen(srgb_linear_multiply(vc.getGreen(), 1.3, 255.0));
-                                       vc.setBlue (srgb_linear_multiply(vc.getBlue(),  1.3, 255.0));
+                               // Make sides and bottom darker than the top
+                               video::SColor &vc = vertices[vertexIndex].Color;
+                               if(vertices[vertexIndex].Normal.Y > 0.5) {
+                                       vc.setRed  (srgb_linear_multiply(vc.getRed(),   1.2, 255.0));
+                                       vc.setGreen(srgb_linear_multiply(vc.getGreen(), 1.2, 255.0));
+                                       vc.setBlue (srgb_linear_multiply(vc.getBlue(),  1.2, 255.0));
+                               } else if (vertices[vertexIndex].Normal.Y < -0.5) {
+                                       vc.setRed  (srgb_linear_multiply(vc.getRed(),   0.3, 255.0));
+                                       vc.setGreen(srgb_linear_multiply(vc.getGreen(), 0.3, 255.0));
+                                       vc.setBlue (srgb_linear_multiply(vc.getBlue(),  0.3, 255.0));
+                               } else if (vertices[vertexIndex].Normal.X > 0.5) {
+                                       vc.setRed  (srgb_linear_multiply(vc.getRed(),   0.8, 255.0));
+                                       vc.setGreen(srgb_linear_multiply(vc.getGreen(), 0.8, 255.0));
+                                       vc.setBlue (srgb_linear_multiply(vc.getBlue(),  0.8, 255.0));
+                               } else if (vertices[vertexIndex].Normal.X < -0.5) {
+                                       vc.setRed  (srgb_linear_multiply(vc.getRed(),   0.8, 255.0));
+                                       vc.setGreen(srgb_linear_multiply(vc.getGreen(), 0.8, 255.0));
+                                       vc.setBlue (srgb_linear_multiply(vc.getBlue(),  0.8, 255.0));
+                               } else if (vertices[vertexIndex].Normal.Z > 0.5) {
+                                       vc.setRed  (srgb_linear_multiply(vc.getRed(),   0.5, 255.0));
+                                       vc.setGreen(srgb_linear_multiply(vc.getGreen(), 0.5, 255.0));
+                                       vc.setBlue (srgb_linear_multiply(vc.getBlue(),  0.5, 255.0));
+                               } else if (vertices[vertexIndex].Normal.Z < -0.5) {
+                                       vc.setRed  (srgb_linear_multiply(vc.getRed(),   0.5, 255.0));
+                                       vc.setGreen(srgb_linear_multiply(vc.getGreen(), 0.5, 255.0));
+                                       vc.setBlue (srgb_linear_multiply(vc.getBlue(),  0.5, 255.0));
                                }
                        }
                }