01

The camera is your scrollbar.

Nothing here is a video. Scroll position is normalised to 0–1 and handed straight to the fragment shader as a uniform. The corridor is a signed-distance field; you are moving a ray origin through it.

02

One clock, not three.

Lenis drives smooth scroll, GSAP's ticker drives the render loop, and the shader reads from the same frame. No competing requestAnimationFrame loops — that is what makes scroll-linked 3D feel attached rather than laggy.

03

Geometry, not footage.

The walls are a repeated box field folded with a modulo, so the corridor is infinite for the cost of one shape. Scrubbing backwards costs exactly the same as scrubbing forwards.

04

And it degrades.

No WebGL2 or reduced-motion enabled, and the canvas is dropped for a static gradient. Every word on this page still reads.