#version 330 // Input vertex attributes (from vertex shader) in vec2 fragTexCoord; in vec4 fragColor; // Input uniform values uniform sampler2D texture0; uniform vec4 colDiffuse; uniform float u_time; uniform float u_glitchIntensity; uniform vec2 u_resolution; // Output fragment color out vec4 finalColor; void main() { vec2 uv = fragTexCoord; // 1. Digital Glitch / Chromatic Aberration float glitch = clamp(u_glitchIntensity, 0.0, 1.0); if (glitch > 0.001) { // Horizontal line slice displacement float slice = step(0.65, sin(uv.y * 35.0 + u_time * 25.0)); float sliceOffset = (slice * 2.0 - 1.0) * 0.018 * glitch; uv.x += sliceOffset; // Chromatic RGB separation float split = 0.012 * glitch; float r = texture(texture0, vec2(uv.x + split, uv.y)).r; float g = texture(texture0, uv).g; float b = texture(texture0, vec2(uv.x - split, uv.y)).b; finalColor = vec4(r, g, b, 1.0); } else { finalColor = texture(texture0, uv); } // 2. Neon Bloom / Emissive Halo vec2 texel = 1.0 / u_resolution; vec3 bloom = vec3(0.0); float bloomWeight = 0.0; // 9-tap bright-pass sample vec2 offsets[8] = vec2[]( vec2(-2.0, 0.0), vec2( 2.0, 0.0), vec2( 0.0, -2.0), vec2( 0.0, 2.0), vec2(-1.5, -1.5), vec2( 1.5, -1.5), vec2(-1.5, 1.5), vec2( 1.5, 1.5) ); for (int i = 0; i < 8; ++i) { vec3 col = texture(texture0, uv + offsets[i] * texel * 1.8).rgb; float brightness = dot(col, vec3(0.2126, 0.7152, 0.0722)); if (brightness > 0.55) { bloom += (col - 0.45) * 1.4; bloomWeight += 1.0; } } if (bloomWeight > 0.0) { bloom /= 8.0; finalColor.rgb += bloom * 0.75; } // 3. Vignette (Smooth cinematic edge darkening) float d = distance(uv, vec2(0.5, 0.5)); float vignette = smoothstep(0.82, 0.38, d); finalColor.rgb *= mix(0.58, 1.0, vignette); // 4. Subtle Cyber Scanlines float scanline = sin(uv.y * u_resolution.y * 1.8) * 0.035; finalColor.rgb -= scanline; finalColor.a = 1.0; }