summaryrefslogtreecommitdiff
path: root/shaders/bloom-down.frag.glsl
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-09-29 07:41:35 -0300
committerGabriel Schneider <[email protected]>2026-10-01 00:12:16 -0300
commit411d0b6059192b75853e220e1242b694ae461a3e (patch)
tree50f8bb207f3cdda497bdd84658a2d3ea74b4bc2b /shaders/bloom-down.frag.glsl
parentda920ca49e3f5d1649e811bbdc3ddba482c6aae4 (diff)
parent5526c68beec454cfe607a579723b97b4848e7d3a (diff)
downloadpardes-411d0b6059192b75853e220e1242b694ae461a3e.tar.gz
pardes-411d0b6059192b75853e220e1242b694ae461a3e.zip
Merge: 9P rounds 9-17 + render DPI, dark tints, G4-G10
Diffstat (limited to 'shaders/bloom-down.frag.glsl')
-rw-r--r--shaders/bloom-down.frag.glsl39
1 files changed, 39 insertions, 0 deletions
diff --git a/shaders/bloom-down.frag.glsl b/shaders/bloom-down.frag.glsl
new file mode 100644
index 00000000..3465926d
--- /dev/null
+++ b/shaders/bloom-down.frag.glsl
@@ -0,0 +1,39 @@
+#version 450
+
+// Bloom, down (docs/effects.md G4): one step of a dual Kawase filter, a
+// source half as big again sampled at five points, the first step over the
+// frame through a bright pass in linear light. Written to a float target.
+
+layout(set = 2, binding = 0) uniform sampler2D source;
+layout(std140, set = 3, binding = 0) uniform BloomStep {
+ // xy: a source texel; zw: a target texel.
+ vec4 texels;
+ // x: the bright pass's threshold on a channel's linear peak (above the
+ // page's own), 0 for none (a later step); y: its soft knee.
+ vec4 pass;
+} u;
+
+layout(location = 0) out vec4 o_col;
+
+vec3 toLinear(vec3 c) {
+ return mix(pow((c + 0.055) / 1.055, vec3(2.4)), c / 12.92, lessThanEqual(c, vec3(0.04045)));
+}
+
+vec3 tap(vec2 uv) {
+ vec3 c = texture(source, uv).rgb;
+ if (u.pass.x <= 0.0) return c;
+ c = toLinear(c);
+ float peak = max(c.r, max(c.g, c.b));
+ return c * smoothstep(u.pass.x, u.pass.x + u.pass.y, peak);
+}
+
+void main() {
+ vec2 uv = gl_FragCoord.xy * u.texels.zw;
+ vec2 h = 0.5 * u.texels.xy;
+ vec3 sum = tap(uv) * 4.0;
+ sum += tap(uv - h);
+ sum += tap(uv + h);
+ sum += tap(uv + vec2(h.x, -h.y));
+ sum += tap(uv - vec2(h.x, -h.y));
+ o_col = vec4(sum / 8.0, 1.0);
+}