How it works
Fragment shader mixes texA/texB with a noise-shaped threshold; GSAP tweens uProgress, then textures swap.
Noise-displaced liquid morph between images — click, arrow keys or autoplay.
Fragment shader mixes texA/texB with a noise-shaped threshold; GSAP tweens uProgress, then textures swap.
Renders through the single shared <Canvas> via drei <View> — no extra WebGL context, and the render loop only runs while a view is mounted. Only one uniform changes per frame.
Prev/next buttons, live region with the image caption; reduced mode crossfades.
uniform float uIntensity; // 0.4 uniform float uDuration; // 1.4 uniform float uScale; // 3 uniform bool uAutoplay; // false