#version 430 // Adapted from: https://www.shadertoy.com/view/4sf3Dr layout (binding = 0) uniform sampler2D sprite; layout (location = 0) in vec4 color; layout (location = 1) in vec2 uv; layout (location = 0) out vec4 texel; layout (binding = 0) uniform Effect { float screen_width; float screen_height; float time; }; vec3 scanline(vec2 coord, vec3 screen) { screen.rgb -= sin((coord.y + (time * 29.0))) * 0.02; return screen; } vec2 crt(vec2 coord, float bend) { // put in symmetrical coords coord = (coord - 0.5) * 2.0; coord *= 1.0; // deform coords coord.x *= 1.0 + pow((abs(coord.y) / bend), 2.0); coord.y *= 1.0 + pow((abs(coord.x) / bend), 2.0); // transform back to 0.0 - 1.0 space coord = (coord / 2.0) + 0.5; return coord; } void main() { vec2 crtCoords = crt(uv, 4.8); // Split the color channels texel.rgb = texture(sprite, crtCoords).rgb; texel.a = 1; vec2 screenSpace = crtCoords * vec2(screen_width, screen_height); texel.rgb = scanline(screenSpace, texel.rgb); }