Curved glass, phosphor stripes and a bleeding shadow mask. A real tube, not a scanline overlay.
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(){ // Barrel-warp the sample position: the picture is painted on the inside of // a curved tube, so the geometry has to bend before anything else does. vec2 uv = vUv * 2.0 - 1.0; uv *= 1.0 + dot(uv, uv) * uCurve * 0.22; uv = uv * 0.5 + 0.5; if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) { // Off the curved tube's own edge — transparent, not opaque black, so // a transparent source's silhouette doesn't gain a solid frame around it. gl_FragColor = vec4(0.0); return; } vec4 srcTex = texture2D(uTex, uv); vec3 c = srcTex.rgb; c += discBlur(uv, 5.0) * uBleed * 0.6; // Aperture grille: each screen column belongs to one phosphor stripe. float col = floor(uv.x * uResolution.x / 3.0); vec3 stripe = vec3( step(0.5, abs(mod(col, 3.0) - 0.0) < 0.5 ? 1.0 : 0.0), step(0.5, abs(mod(col, 3.0) - 1.0) < 0.5 ? 1.0 : 0.0), step(0.5, abs(mod(col, 3.0) - 2.0) < 0.5 ? 1.0 : 0.0) ); c *= mix(vec3(1.0), stripe * 1.9, uMask * 0.55); // Horizontal scanline gaps, and a slight edge falloff for the tube. c *= 0.72 + 0.28 * sin(uv.y * uResolution.y * 3.14159); vec2 e = abs(uv - 0.5); c *= 1.0 - smoothstep(0.42, 0.72, max(e.x, e.y)) * 0.5; // uv already carries the tube's own barrel warp, so a transparent // source's silhouette curves with the glass. gl_FragColor = vec4(c, srcTex.a); }