ACES (left) vs exp Tonemapping (right)
Log in to post a comment.
#version 300 es
precision highp float;
uniform float iTime;
uniform vec2 iResolution;
uniform float _Red; //value=.04, min=0, max=1, step=0.01
uniform float _Green; //value=.11, min=0, max=1, step=0.01
uniform float _Blue; //value=.09, min=0, max=1, step=0.01
uniform float _Power; //value=1, min=1, max=3, step=0.01
uniform float _SCurve; //value=0.78, min=0, max=1, step=0.01
out vec4 fragColor;
// Based on http://www.oscars.org/science-technology/sci-tech-projects/aces
vec3 aces_tonemap(vec3 color){
mat3 m1 = mat3(
0.59719, 0.07600, 0.02840,
0.35458, 0.90834, 0.13383,
0.04823, 0.01566, 0.83777
);
mat3 m2 = mat3(
1.60475, -0.10208, -0.00327,
-0.53108, 1.10813, -0.07276,
-0.07367, -0.00605, 1.07602
);
vec3 v = m1 * color;
vec3 a = v * (v + 0.0245786) - 0.000090537;
vec3 b = v * (0.983729 * v + 0.4329510) + 0.238081;
return clamp(m2 * (a / b), 0.0, 1.0);
}
vec3 expToneMap(vec3 c){
float s = exp(-dot(c, vec3(_Red, _Green, _Blue)));
c = vec3(1.) - exp(-c);
c = pow(c, vec3(_Power));
c = mix(c, smoothstep(0., 1., c), _SCurve);
return mix(mix(vec3(1.),c, s), c, s);
}
void main()
{
vec2 position = (gl_FragCoord.xy/iResolution.xy)* 2.0 - 1.0;
vec2 p = position;
p.x += iTime * 0.2;
vec3 color = pow(sin(p.x * 4.0 + vec3(0.0, 1.0, 2.0) * 3.1415 * 2.0 / 3.0) * 0.5 + 0.5, vec3(2.0)) * (exp(abs(p.y) * 4.0) - 1.0);
if(position.y < 0.0){
if(position.x < 0.){
color = aces_tonemap(color);
}else{
color = expToneMap (color);
}
}
color = pow(color, vec3(1. / 2.2));
fragColor = vec4(color,1.0);
}