Helix Noise · flowing water · caustics + sun-glints

Flowing water surface — ripples bent along field.sample()

A moving water surface where the wave crests are warped along the flow field's streamlines: a few travelling ripple layers, their lattice bent by the field, shaded with a depth ramp, sharp caustic highlights on the crests, and specular sun-glints. The three dials don't touch the water math — they reshape the underlying flow, and the ripples follow. Move the pointer to steer the sun.

building flow…
move pointer to move the sun
Helicity+0.60
left −1right +1
Handedness of the flow that bends the ripples — the swirl of the current.
Spectral slope1.7
choppylong swells
Steep = a few broad swells steer the surface; shallow = a busy, choppy current.
Phase coherence55%
evenchannelled
Same spectrum, random → structured: the flow channels into distinct currents and eddies.
flow1.0×
bend1.2
waves1.0×

How it works

On each knob change the field is sampled onto a coarse grid, and a short streamline integration gives a per-pixel warp offset — that's what bends the wave lattice to follow the current. Every frame, four travelling ripple layers are summed at the warped coordinate, the surface normal comes from their analytic gradient, and the shader adds a depth ramp, caustic crests, sun specular, and a Fresnel sky term. All the flow comes from field.sample() — the rest is a small surface shader you can lift straight into a fragment program.

Honest limits

This is a stylised surface, not a water simulation — no gravity waves, no shore interaction, no true refraction. The caustics are a crest-focus fake, not a traced light field. It renders on a downscaled buffer and upscales, so at full screen the glints soften. For a physical solver you'd feed the same velocities into a height-field or FFT-ocean; here the point is directable, real-time flow.