Real lens dispersion — colour splits harder toward the edges, exactly as glass does it.
GLSL fragment shader
The effect's own code. The uniforms and helpers above it — uTex, uFeedback, the depth proxy, the frame ring, depthAt(), timeAt() — are the same header every Ether-MOSH shader opens with, and are documented once on the registry rather than reprinted on all 143 pages.
void main(){ // Radial, not uniform. A flat RGB offset is a glitch; dispersion that grows // with distance from the optical centre is a lens, and the eye knows the // difference even when it cannot name it. vec2 rel = vUv - 0.5; float r2 = dot(rel, rel); float reach = uAmount * (1.0 + 1.5 * smoothstep(0.6, 2.0, uAmount)); float k = reach * 0.06 * mix(1.0, r2 * 4.0, uEdge); vec3 c; c.r = texture2D(uTex, clamp(vUv - rel * k, 0.0, 1.0)).r; c.g = texture2D(uTex, vUv).g; c.b = texture2D(uTex, clamp(vUv + rel * k, 0.0, 1.0)).b; gl_FragColor = vec4(c, texture2D(uTex, vUv).a); }