summaryrefslogtreecommitdiff
path: root/shaders/gl_bloom_composite_fragment.glsl
diff options
context:
space:
mode:
authorPeter Fors <peter.fors@mindkiller.com>2025-10-09 22:07:52 +0200
committerPeter Fors <peter.fors@mindkiller.com>2025-10-09 22:07:52 +0200
commit030724a9aea346e4a9843d5842fb28c6d6c4cf1a (patch)
treef06fb84aaef64b2f4e2d81b3d2d3eef71bad83ec /shaders/gl_bloom_composite_fragment.glsl
parent412b2ef851516c1de8ba5006ddd284192cbcaf9b (diff)
Rearrangement and refactoring and optimizations and more accuracy
Diffstat (limited to 'shaders/gl_bloom_composite_fragment.glsl')
-rw-r--r--shaders/gl_bloom_composite_fragment.glsl38
1 files changed, 38 insertions, 0 deletions
diff --git a/shaders/gl_bloom_composite_fragment.glsl b/shaders/gl_bloom_composite_fragment.glsl
new file mode 100644
index 0000000..5977e91
--- /dev/null
+++ b/shaders/gl_bloom_composite_fragment.glsl
@@ -0,0 +1,38 @@
+out vec4 outcolor;
+in vec2 frag_texture_coord;
+
+uniform sampler2D crt_texture;
+uniform sampler2D bloom_texture;
+uniform float bloom_strength;
+uniform vec2 bloom_size;
+uniform vec2 src_image_size;
+uniform vec2 viewport_size;
+
+void main() {
+ vec3 crt_color = texture(crt_texture, frag_texture_coord).rgb;
+ vec3 bloom_color = texture(bloom_texture, frag_texture_coord).rgb;
+
+ // Calculate warp boundary mask to clip bloom outside CRT area
+ vec2 ipos = frag_texture_coord * viewport_size;
+ // Convert to normalized device coordinates [-1, 1]
+ vec2 pos = ipos * (2.0 / viewport_size) - vec2(1.0);
+ // Apply barrel distortion
+ vec2 warp = vec2(1.0 / 24.0, 1.0 / 16.0);
+ pos *= vec2(1.0 + (pos.y * pos.y) * warp.x, 1.0 + (pos.x * pos.x) * warp.y);
+ // Convert back to UV
+ vec2 uv = (pos + vec2(1.0)) * 0.5;
+
+ // Rounded corner cutoff (CRT bezel effect) - only clips the corners
+ float corner_radius = 0.05; // Radius of corner rounding (0.0 = sharp corners, 0.2 = very rounded)
+ vec2 edge_distance = abs(pos) - vec2(1.0 - corner_radius);
+ float dist = length(max(edge_distance, 0.0));
+
+ // Antialiased edge using smoothstep (creates soft 1-2 pixel transition)
+ float edge_softness = 0.003; // Controls antialiasing width (smaller = sharper)
+ float mask = smoothstep(corner_radius + edge_softness, corner_radius - edge_softness, dist);
+
+ // Also check bounds
+ mask *= (uv.x >= 0.0 && uv.x <= 1.0 && uv.y >= 0.0 && uv.y <= 1.0) ? 1.0 : 0.0;
+
+ outcolor = vec4((crt_color + bloom_color * bloom_strength) * mask, 1.0);
+}