From 7a0c4e942375f6ca665232b46b8c9edc1a76045f Mon Sep 17 00:00:00 2001 From: hyzboy Date: Mon, 20 Jan 2020 17:42:45 +0800 Subject: [PATCH] add ToneMapping.glsl --- res/shader/ToneMapping.glsl | 85 +++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 res/shader/ToneMapping.glsl diff --git a/res/shader/ToneMapping.glsl b/res/shader/ToneMapping.glsl new file mode 100644 index 00000000..a714b549 --- /dev/null +++ b/res/shader/ToneMapping.glsl @@ -0,0 +1,85 @@ +/* + +This shader experiments the effect of different tone mapping operators. +This is still a work in progress. + +More info: +http://slideshare.net/ozlael/hable-john-uncharted2-hdr-lighting +http://filmicgames.com/archives/75 +http://filmicgames.com/archives/183 +http://filmicgames.com/archives/190 +http://imdoingitwrong.wordpress.com/2010/08/19/why-reinhard-desaturates-my-blacks-3/ +http://mynameismjp.wordpress.com/2010/04/30/a-closer-look-at-tone-mapping/ +http://renderwonk.com/publications/s2010-color-course/ + +-- +Zavie + +*/ + +vec3 linearToneMapping(vec3 color) +{ + float exposure = 1.; + color = clamp(exposure * color, 0., 1.); + color = pow(color, vec3(1. / gamma)); + return color; +} + +vec3 simpleReinhardToneMapping(vec3 color) +{ + float exposure = 1.5; + color *= exposure/(1. + color / exposure); + color = pow(color, vec3(1. / gamma)); + return color; +} + +vec3 lumaBasedReinhardToneMapping(vec3 color) +{ + float luma = dot(color, vec3(0.2126, 0.7152, 0.0722)); + float toneMappedLuma = luma / (1. + luma); + color *= toneMappedLuma / luma; + color = pow(color, vec3(1. / gamma)); + return color; +} + +vec3 whitePreservingLumaBasedReinhardToneMapping(vec3 color) +{ + float white = 2.; + float luma = dot(color, vec3(0.2126, 0.7152, 0.0722)); + float toneMappedLuma = luma * (1. + luma / (white*white)) / (1. + luma); + color *= toneMappedLuma / luma; + color = pow(color, vec3(1. / gamma)); + return color; +} + +vec3 RomBinDaHouseToneMapping(vec3 color) +{ + color = exp( -1.0 / ( 2.72*color + 0.15 ) ); + color = pow(color, vec3(1. / gamma)); + return color; +} + +vec3 filmicToneMapping(vec3 color) +{ + color = max(vec3(0.), color - vec3(0.004)); + color = (color * (6.2 * color + .5)) / (color * (6.2 * color + 1.7) + 0.06); + return color; +} + +vec3 Uncharted2ToneMapping(vec3 color) +{ + float A = 0.15; + float B = 0.50; + float C = 0.10; + float D = 0.20; + float E = 0.02; + float F = 0.30; + float W = 11.2; + float exposure = 2.; + color *= exposure; + color = ((color * (A * color + C * B) + D * E) / (color * (A * color + B) + D * F)) - E / F; + float white = ((W * (A * W + C * B) + D * E) / (W * (A * W + B) + D * F)) - E / F; + color /= white; + color = pow(color, vec3(1. / gamma)); + return color; +}