]> git.lizzy.rs Git - minetest.git/blob - client/shaders/second_stage/opengl_fragment.glsl
Improve bloom effect (#12916)
[minetest.git] / client / shaders / second_stage / opengl_fragment.glsl
1 #define rendered texture0
2 #define bloom texture1
3
4 uniform sampler2D rendered;
5 uniform sampler2D bloom;
6 uniform mediump float exposureFactor;
7 uniform lowp float bloomIntensity;
8
9 #ifdef GL_ES
10 varying mediump vec2 varTexCoord;
11 #else
12 centroid varying vec2 varTexCoord;
13 #endif
14
15 #ifdef ENABLE_BLOOM
16
17 vec4 applyBloom(vec4 color, vec2 uv)
18 {
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);
23         if (uv.x < 0.5)
24                 return light;
25 #endif
26         color.rgb = mix(color.rgb, light, bloomIntensity);
27         return color;
28 }
29
30 #endif
31
32 #if ENABLE_TONE_MAPPING
33
34 /* Hable's UC2 Tone mapping parameters
35         A = 0.22;
36         B = 0.30;
37         C = 0.10;
38         D = 0.20;
39         E = 0.01;
40         F = 0.30;
41         W = 11.2;
42         equation used:  ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F
43 */
44
45 vec3 uncharted2Tonemap(vec3 x)
46 {
47         return ((x * (0.22 * x + 0.03) + 0.002) / (x * (0.22 * x + 0.3) + 0.06)) - 0.03333;
48 }
49
50 vec4 applyToneMapping(vec4 color)
51 {
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;
58         return color;
59 }
60 #endif
61
62 void main(void)
63 {
64         vec2 uv = varTexCoord.st;
65         vec4 color = texture2D(rendered, uv).rgba;
66
67         // translate to linear colorspace (approximate)
68         color.rgb = pow(color.rgb, vec3(2.2));
69
70 #ifdef ENABLE_BLOOM_DEBUG
71         if (uv.x > 0.5 || uv.y > 0.5)
72 #endif
73         {
74                 color.rgb *= exposureFactor;
75         }
76
77
78 #ifdef ENABLE_BLOOM
79         color = applyBloom(color, uv);
80 #endif
81
82 #ifdef ENABLE_BLOOM_DEBUG
83         if (uv.x > 0.5 || uv.y > 0.5)
84 #endif
85         {
86 #if ENABLE_TONE_MAPPING
87                 color = applyToneMapping(color);
88 #endif
89         }
90
91         color.rgb = clamp(color.rgb, vec3(0.), vec3(1.));
92
93         // return to sRGB colorspace (approximate)
94         color.rgb = pow(color.rgb, vec3(1.0 / 2.2));
95
96         gl_FragColor = vec4(color.rgb, 1.0); // force full alpha to avoid holes in the image.
97 }