Motion becomes a fluid field — the frame churns and curls around anything that moves.
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(){ vec2 f = flowAt(vUv); // Rotating the flow vector 90 degrees turns translation into circulation: // the curl of the field rather than the field itself, which is what makes // it read as fluid rather than as a shove. vec2 curl = vec2(-f.y, f.x); vec2 dir = mix(f, curl, uSwirl); float n = noise(vUv * (3.0 + uScale * 22.0) + uTime * 0.35); vec2 off = dir * uAmount * 0.14 * (0.55 + n * 0.9) * (0.7 + uPulse * 0.7); gl_FragColor = texture2D(uTex, clamp(vUv - off, 0.0, 1.0)); }