1#version 450
2
3layout(push_constant) uniform Push
4{
5	vec4 SourceSize;
6	vec4 OriginalSize;
7	vec4 OutputSize;
8	uint FrameCount;
9   float TAPSV;
10   float GLOW_FALLOFF_V;
11} params;
12
13// Higher value, more centered glow.
14// Lower values might need more taps.
15// Parameter lines go here:
16#pragma parameter TAPSV "V. Glow Radius" 4.0 1.0 10.0 1.0
17#define TAPSV params.TAPSV
18#pragma parameter GLOW_FALLOFF_V "Vertical Glow Grade" 0.30 0.00 1.0 0.01
19#define GLOW_FALLOFF_V params.GLOW_FALLOFF_V
20
21layout(std140, set = 0, binding = 0) uniform UBO
22{
23	mat4 MVP;
24} global;
25
26#pragma stage vertex
27layout(location = 0) in vec4 Position;
28layout(location = 1) in vec2 TexCoord;
29layout(location = 0) out vec2 vTexCoord;
30
31void main()
32{
33   gl_Position = global.MVP * Position;
34   vTexCoord = TexCoord;
35}
36
37#pragma stage fragment
38layout(location = 0) in vec2 vTexCoord;
39layout(location = 0) out vec4 FragColor;
40layout(set = 0, binding = 2) uniform sampler2D Source;
41
42#define COMPAT_TEXTURE(c,d) texture(c,d)
43#define SourceSize params.SourceSize
44
45#define kernel(x) exp(-GLOW_FALLOFF_V * (x) * (x))
46
47void main()
48{
49	vec3 col = vec3(0.0);
50	float dy = SourceSize.w;
51
52	float k_total = 0.;
53	for (float i = -TAPSV; i <= TAPSV; i++)
54		{
55		float k = kernel(i);
56		k_total += k;
57		col += k * COMPAT_TEXTURE(Source, vTexCoord + vec2(0.0, float(i) * dy)).rgb;
58		}
59   FragColor = vec4(col / k_total, 1.0);
60}