diff options
author | RealBadAngel <maciej.kasatkin@o2.pl> | 2016-01-25 13:33:22 +0100 |
---|---|---|
committer | kwolekr <kwolekr@minetest.net> | 2016-02-09 02:55:59 -0500 |
commit | eb3840a3f88dd9902ff1c5ea50d90a7f33e08d82 (patch) | |
tree | 3248c3bc66339f2c4cadc8fbf2cfb10a12c1f238 /client/shaders | |
parent | 180893e79dd358d2f8f720b200a62daa2838e341 (diff) | |
download | minetest-eb3840a3f88dd9902ff1c5ea50d90a7f33e08d82.tar.gz minetest-eb3840a3f88dd9902ff1c5ea50d90a7f33e08d82.tar.bz2 minetest-eb3840a3f88dd9902ff1c5ea50d90a7f33e08d82.zip |
Filmic HDR tone mapping
Diffstat (limited to 'client/shaders')
-rw-r--r-- | client/shaders/nodes_shader/opengl_fragment.glsl | 48 | ||||
-rw-r--r-- | client/shaders/water_surface_shader/opengl_fragment.glsl | 52 |
2 files changed, 86 insertions, 14 deletions
diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl index b3789e1cb..49befa8d4 100644 --- a/client/shaders/nodes_shader/opengl_fragment.glsl +++ b/client/shaders/nodes_shader/opengl_fragment.glsl @@ -20,6 +20,38 @@ bool normalTexturePresent = 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)); @@ -160,22 +192,26 @@ void main(void) 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) { 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) { 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 } 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 } |