1 #define rendered texture0
4 uniform sampler2D rendered;
5 uniform sampler2D bloom;
6 uniform mediump float exposureFactor;
7 uniform lowp float bloomIntensity;
10 varying mediump vec2 varTexCoord;
12 centroid varying vec2 varTexCoord;
17 vec4 applyBloom(vec4 color, vec2 uv)
19 vec3 light = texture2D(bloom, uv).rgb;
20 #ifdef ENABLE_BLOOM_DEBUG
21 if (uv.x > 0.5 && uv.y < 0.5)
22 return vec4(light, color.a);
26 color.rgb = mix(color.rgb, light, bloomIntensity);
32 #if ENABLE_TONE_MAPPING
34 /* Hable's UC2 Tone mapping parameters
42 equation used: ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F
45 vec3 uncharted2Tonemap(vec3 x)
47 return ((x * (0.22 * x + 0.03) + 0.002) / (x * (0.22 * x + 0.3) + 0.06)) - 0.03333;
50 vec4 applyToneMapping(vec4 color)
52 const float exposureBias = 2.0;
53 color.rgb = uncharted2Tonemap(exposureBias * color.rgb);
54 // Precalculated white_scale from
55 //vec3 whiteScale = 1.0 / uncharted2Tonemap(vec3(W));
56 vec3 whiteScale = vec3(1.036015346);
57 color.rgb *= whiteScale;
64 vec2 uv = varTexCoord.st;
65 vec4 color = texture2D(rendered, uv).rgba;
67 // translate to linear colorspace (approximate)
68 color.rgb = pow(color.rgb, vec3(2.2));
70 #ifdef ENABLE_BLOOM_DEBUG
71 if (uv.x > 0.5 || uv.y > 0.5)
74 color.rgb *= exposureFactor;
79 color = applyBloom(color, uv);
82 #ifdef ENABLE_BLOOM_DEBUG
83 if (uv.x > 0.5 || uv.y > 0.5)
86 #if ENABLE_TONE_MAPPING
87 color = applyToneMapping(color);
91 color.rgb = clamp(color.rgb, vec3(0.), vec3(1.));
93 // return to sRGB colorspace (approximate)
94 color.rgb = pow(color.rgb, vec3(1.0 / 2.2));
96 gl_FragColor = vec4(color.rgb, 1.0); // force full alpha to avoid holes in the image.