From eb3840a3f88dd9902ff1c5ea50d90a7f33e08d82 Mon Sep 17 00:00:00 2001 From: RealBadAngel Date: Mon, 25 Jan 2016 13:33:22 +0100 Subject: Filmic HDR tone mapping --- .../water_surface_shader/opengl_fragment.glsl | 52 ++++++++++++++++++---- 1 file changed, 44 insertions(+), 8 deletions(-) (limited to 'client/shaders/water_surface_shader/opengl_fragment.glsl') diff --git a/client/shaders/water_surface_shader/opengl_fragment.glsl b/client/shaders/water_surface_shader/opengl_fragment.glsl index 75751e243..1fa669541 100644 --- a/client/shaders/water_surface_shader/opengl_fragment.glsl +++ b/client/shaders/water_surface_shader/opengl_fragment.glsl @@ -22,6 +22,38 @@ bool texSeamless = false; const float e = 2.718281828459; const float BS = 10.0; +#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.03334; +} + +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)); @@ -116,22 +148,26 @@ vec4 base = texture2D(baseTexture, uv).rgba; color = base.rgb; #endif + vec4 col = vec4(color.rgb * gl_Color.rgb, 1.0); + #if MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT || MATERIAL_TYPE == TILE_MATERIAL_LIQUID_OPAQUE float alpha = gl_Color.a; - vec4 col = vec4(color.rgb, alpha); - col *= gl_Color; - if(fogDistance != 0.0){ + 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); } - gl_FragColor = vec4(col.rgb, alpha); + col = vec4(col.rgb, alpha); #else - vec4 col = vec4(color.rgb, base.a); - col *= gl_Color; - if(fogDistance != 0.0){ + if (fogDistance != 0.0) { float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0)); col = mix(col, skyBgColor, d); } - gl_FragColor = vec4(col.rgb, base.a); + col = vec4(col.rgb, base.a); +#endif + +#ifdef ENABLE_TONE_MAPPING + gl_FragColor = applyToneMapping(col); +#else + gl_FragColor = col; #endif } -- cgit v1.2.3