diff options
Diffstat (limited to 'shaders/bloom-down.frag.glsl')
| -rw-r--r-- | shaders/bloom-down.frag.glsl | 39 |
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); +} |
