/
bloom.dei
87 lines (72 loc) · 3.94 KB
/
bloom.dei
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# Bloom is a specialized additive blur that only applies to bright pixels
# (given a configurable threshold for brightness).
fx.bloom {
common = "
uniform mat4 uMvpMatrix;
uniform vec4 uColor;
uniform vec4 uWindow;
in vec4 aVertex;
in vec2 aUV;
out vec2 vUV;
void main(void) {
gl_Position = uMvpMatrix * aVertex;
vUV = uWindow.xy + aUV * uWindow.zw;
}"
shader horizontal {
vertex $= fx.bloom.common
fragment = "
uniform sampler2D uTex;
uniform float uIntensity;
uniform float uThreshold;
uniform vec2 uBlurStep;
in vec2 vUV;
void main(void) {
vec4 sum = vec4(0.0);
sum += texture(uTex, vec2(vUV.s - 7.0 * uBlurStep.s, vUV.t)) * 0.0249;
sum += texture(uTex, vec2(vUV.s - 6.0 * uBlurStep.s, vUV.t)) * 0.0367;
sum += texture(uTex, vec2(vUV.s - 5.0 * uBlurStep.s, vUV.t)) * 0.0498;
sum += texture(uTex, vec2(vUV.s - 4.0 * uBlurStep.s, vUV.t)) * 0.0660;
sum += texture(uTex, vec2(vUV.s - 3.0 * uBlurStep.s, vUV.t)) * 0.0803;
sum += texture(uTex, vec2(vUV.s - 2.0 * uBlurStep.s, vUV.t)) * 0.0915;
sum += texture(uTex, vec2(vUV.s - uBlurStep.s, vUV.t)) * 0.0996;
sum += texture(uTex, vUV) * 0.1027;
sum += texture(uTex, vec2(vUV.s + uBlurStep.s, vUV.t)) * 0.0996;
sum += texture(uTex, vec2(vUV.s + 2.0 * uBlurStep.s, vUV.t)) * 0.0915;
sum += texture(uTex, vec2(vUV.s + 3.0 * uBlurStep.s, vUV.t)) * 0.0803;
sum += texture(uTex, vec2(vUV.s + 4.0 * uBlurStep.s, vUV.t)) * 0.0660;
sum += texture(uTex, vec2(vUV.s + 5.0 * uBlurStep.s, vUV.t)) * 0.0498;
sum += texture(uTex, vec2(vUV.s + 6.0 * uBlurStep.s, vUV.t)) * 0.0367;
sum += texture(uTex, vec2(vUV.s + 7.0 * uBlurStep.s, vUV.t)) * 0.0249;
// Apply a threshold that gets rid of dark, non-luminous pixels.
float intens = max(sum.r, max(sum.g, sum.b));
intens = (intens - uThreshold) * uIntensity;
out_FragColor = vec4(vec3(intens) * normalize(sum.rgb + 0.2), 1.0);
}"
}
shader vertical {
vertex $= fx.bloom.common
fragment = "
uniform sampler2D uTex;
uniform vec2 uBlurStep;
in vec2 vUV;
void main(void) {
vec4 sum = vec4(0.0);
sum += texture(uTex, vec2(vUV.s, vUV.t - 7.0 * uBlurStep.t)) * 0.0249;
sum += texture(uTex, vec2(vUV.s, vUV.t - 6.0 * uBlurStep.t)) * 0.0367;
sum += texture(uTex, vec2(vUV.s, vUV.t - 5.0 * uBlurStep.t)) * 0.0498;
sum += texture(uTex, vec2(vUV.s, vUV.t - 4.0 * uBlurStep.t)) * 0.0660;
sum += texture(uTex, vec2(vUV.s, vUV.t - 3.0 * uBlurStep.t)) * 0.0803;
sum += texture(uTex, vec2(vUV.s, vUV.t - 2.0 * uBlurStep.t)) * 0.0915;
sum += texture(uTex, vec2(vUV.s, vUV.t - uBlurStep.t )) * 0.0996;
sum += texture(uTex, vUV) * 0.1027;
sum += texture(uTex, vec2(vUV.s, vUV.t + uBlurStep.t )) * 0.0996;
sum += texture(uTex, vec2(vUV.s, vUV.t + 2.0 * uBlurStep.t)) * 0.0915;
sum += texture(uTex, vec2(vUV.s, vUV.t + 3.0 * uBlurStep.t)) * 0.0803;
sum += texture(uTex, vec2(vUV.s, vUV.t + 4.0 * uBlurStep.t)) * 0.0660;
sum += texture(uTex, vec2(vUV.s, vUV.t + 5.0 * uBlurStep.t)) * 0.0498;
sum += texture(uTex, vec2(vUV.s, vUV.t + 6.0 * uBlurStep.t)) * 0.0367;
sum += texture(uTex, vec2(vUV.s, vUV.t + 7.0 * uBlurStep.t)) * 0.0249;
out_FragColor = sum;
}"
}
}