Pixels that changed get shoved along their direction of travel — the image gains inertia.
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 px = 1.0/uResolution; vec4 cur = texture2D(uTex, vUv); // Cheap motion estimate: where does frame difference fall off fastest? float d0 = length(cur.rgb - texture2D(uFeedback, vUv).rgb); float dx = length(texture2D(uTex, vUv + vec2(px.x*2.0,0.0)).rgb - texture2D(uFeedback, vUv + vec2(px.x*2.0,0.0)).rgb); float dy = length(texture2D(uTex, vUv + vec2(0.0,px.y*2.0)).rgb - texture2D(uFeedback, vUv + vec2(0.0,px.y*2.0)).rgb); vec2 flow = vec2(dx - d0, dy - d0); float m = clamp(d0 * 3.0, 0.0, 1.0); vec2 push = flow * uReach * 0.35; vec4 shoved = texture2D(uTex, vUv - push); vec3 ghost = texture2D(uFeedback, vUv - push * 2.0).rgb; gl_FragColor = vec4(mix(cur.rgb, mix(shoved.rgb, ghost, 0.4), m * uAmount), cur.a); }