The image becomes a springy surface. Motion and beats send real simulated waves through it.
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(){ vec4 base=texture2D(uTex,vUv); vec2 px=vec2(1.0/96.0); float h=texture2D(uMotionTex,vUv).r*2.0-1.0; vec2 slope=vec2(texture2D(uMotionTex,vUv+vec2(px.x,0.0)).r-texture2D(uMotionTex,vUv-vec2(px.x,0.0)).r,texture2D(uMotionTex,vUv+vec2(0.0,px.y)).r-texture2D(uMotionTex,vUv-vec2(0.0,px.y)).r); vec2 uv=clamp(vUv+slope*mix(.08,.5,uStretch)+h*.022*vec2(sin(uTime*.3),cos(uTime*.4)),0.0,1.0); vec4 skin=texture2D(uTex,uv); vec3 normal=normalize(vec3(-slope*18.0,1.0)); float light=max(dot(normal,normalize(vec3(-.5,.6,1.0))),0.0); float sheen=pow(max(dot(reflect(-normalize(vec3(-.5,.6,1.0)),normal),vec3(0.0,0.0,1.0)),0.0),18.0); skin.rgb=skin.rgb*mix(1.0,.55+light*.65,uSheen)+sheen*uSheen*.3*skin.a; gl_FragColor=mix(base,skin,clamp(uAmount,0.0,1.0)); }