Add tone mapping for entities (#9521)
authorDanila Shutov <dcbrwn2@gmail.com>
Mon, 6 Apr 2020 14:06:40 +0000 (17:06 +0300)
committerGitHub <noreply@github.com>
Mon, 6 Apr 2020 14:06:40 +0000 (16:06 +0200)
fixes #9301

client/shaders/object_shader/opengl_fragment.glsl

index bb9e406370f50d5d55e2a1f9855c4ef82a371e26..32f3e974e3074a532a298ceca66eb359f42bf02c 100644 (file)
@@ -25,6 +25,38 @@ const float BS = 10.0;
 const float fogStart = FOG_START;
 const float fogShadingParameter = 1 / ( 1 - fogStart);
 
+#ifdef ENABLE_TONE_MAPPING
+
+/* Hable's UC2 Tone mapping parameters
+       A = 0.22;
+       B = 0.30;
+       C = 0.10;
+       D = 0.20;
+       E = 0.01;
+       F = 0.30;
+       W = 11.2;
+       equation used:  ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F
+*/
+
+vec3 uncharted2Tonemap(vec3 x)
+{
+       return ((x * (0.22 * x + 0.03) + 0.002) / (x * (0.22 * x + 0.3) + 0.06)) - 0.03333;
+}
+
+vec4 applyToneMapping(vec4 color)
+{
+       color = vec4(pow(color.rgb, vec3(2.2)), color.a);
+       const float gamma = 1.6;
+       const float exposureBias = 5.5;
+       color.rgb = uncharted2Tonemap(exposureBias * color.rgb);
+       // Precalculated white_scale from 
+       //vec3 whiteScale = 1.0 / uncharted2Tonemap(vec3(W));
+       vec3 whiteScale = vec3(1.036015346);
+       color.rgb *= whiteScale;
+       return vec4(pow(color.rgb, vec3(1.0 / gamma)), color.a);
+}
+#endif
+
 void get_texture_flags()
 {
        vec4 flags = texture2D(textureFlags, vec2(0.0, 0.0));
@@ -114,6 +146,11 @@ void main(void)
        vec4 col = vec4(color.rgb, base.a);
 
        col.rgb *= emissiveColor.rgb * vIDiff;
+               
+#ifdef ENABLE_TONE_MAPPING
+       col = applyToneMapping(col);
+#endif
+
        // 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.