--- /dev/null
+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);
+}