import postprocess; uniform sampler1D curve; uniform ToneMapping { float peak; float brightness; }; ////// fragment void main() { vec4 sample = texture(source, texcoord); float maxc = max(sample.r, max(sample.g, sample.b)); if(maxc>1.0-peak) { vec3 saturated = sample.rgb/maxc; if(maxc>1.0+peak) { sample.rgb = mix(vec3(1.0), saturated, 1.0/pow(brightness, maxc-1.0-peak)); } else { float x = (1.0+peak-maxc)/(2.0*peak); sample.rgb = saturated.rgb*(1.0-peak+(1.0-x*x)*peak); } } frag_color = vec4(texture(curve, sample.r).r, texture(curve, sample.g).r, texture(curve, sample.b).r, sample.a); }