Horizontal chroma smear, retro tape.
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(){ // Full tape damage: chroma smear, drifting tracking bands, dropouts and a // head-switching tear along the bottom. Previously a faint horizontal // chroma offset, which is why it read as interchangeable with RGB Shift. float tape = uTime * 0.6; float trackBand = smoothstep(mix(0.85, 0.05, uTracking), 1.0, sin(vUv.y * 34.0 - tape * 3.0)); float wobble = (noise(vec2(vUv.y * 90.0, tape * 4.0)) - 0.5) * uAmount * 0.18 * trackBand; // Head switching: the bottom of the frame shears hard, as on a real deck. float headSwitch = smoothstep(0.10, 0.0, vUv.y); wobble += (noise(vec2(vUv.y * 220.0, tape * 9.0)) - 0.5) * uAmount * 0.34 * headSwitch; vec2 uv = vec2(fract(vUv.x + wobble), vUv.y); vec3 col; col.r = texture2D(uTex, uv + vec2(0.028*uAmount, 0.0)).r; col.g = texture2D(uTex, uv).g; col.b = texture2D(uTex, uv - vec2(0.040*uAmount, 0.0)).b; // Dropouts and luma noise, concentrated in the tracking bands. float dropout = step(0.985, noise(vec2(vUv.y * 300.0, tape * 12.0))); col = mix(col, vec3(0.78), dropout * uAmount * 0.85); col += (noise(vUv * vec2(60.0, 700.0) + tape) - 0.5) * uAmount * 0.34 * (0.3 + trackBand); // Interlace darkening so it reads as a tape image rather than a tint. col *= 1.0 - 0.24 * uAmount * step(0.5, fract(vUv.y * uResolution.y * 0.5)); // uv already carries the tracking wobble, so a transparent source's // silhouette wobbles with the tape rather than staying rigid under it. gl_FragColor = vec4(col, texture2D(uTex, uv).a); }