Skip to content
AnimationStudiosBLUX Physics SuiteGet BLUX
Discord

Whitewater

Spray, foam and bubbles come from a GPU whitewater pass (Ihmsen et al. 2012, Unified Spray, Foam and Bubbles for Particle-Based Fluids). It runs in the solver worker after every simulation step, for Hydro and Atom liquids alike. Its settings are in the Whitewater section of the Surface Mesher node.

Emission comes from three potentials per liquid particle: trapped air (converging flow), breaking wave crests (convex curvature moving along its normal) and kinetic energy. Each is clamped and combined into a spawn rate.

Three tiers, re-classified every frame by how much liquid surrounds each particle:

Tier Where Behaviour
Spray few neighbours Ballistic, with air drag.
Foam some neighbours Rides the liquid’s velocity and fades over its lifetime.
Bubbles many neighbours Buoyant, and dragged along by the flow.

Spray that lands becomes foam. Bubbles that rise become foam. Spray hitting a dry floor dies.

Whitewater is cached per frame as a point PLY next to the particle and surface caches. It renders on its own BLUX_Whitewater object, as a Cycles or EEVEE point cloud.

  • Sizes are set per tier, and foam shrinks as it fades.
  • velocity is stored for motion blur.
  • One shader mixes milky spray droplets, rough foam and refractive air bubbles (IOR 1.333) by tier.
  • A subsample shows in the viewport during live runs and bakes.
Setting Default What it does
Whitewater on Simulate spray, foam and bubbles.
Amount 1 Overall emission multiplier.
Max Particles 2,000,000 Pool size on the GPU, about 72 bytes each.
Trapped Air 300 Particles per liquid particle per second where colliding flow traps air.
Wave Crests 300 Particles per liquid particle per second at breaking wave crests.
Min Speed, Full Speed 0.5, 3 m/s Liquid slower than Min Speed emits nothing. Liquid at Full Speed emits at the full rate.
Foam Lifetime 4 s How long foam lives on the surface.
Spray Air Drag 0.4 Air resistance on spray droplets.
Buoyancy 2 Bubble rise, as a multiple of gravity.
Drag 0.5 How strongly bubbles are carried along by the liquid.
Substeps 4 Advection substeps per frame.
Spray Size, Foam Size, Bubble Size 0.2, 0.3, 0.3 Render sizes, as multiples of the particle radius.
Size Variation 0.6 How much particles of one kind differ in size.
Spray Stretch 1 Stretches spray along its direction of travel for streaks.
Foam Display Both Draw foam as particles, as foam on the liquid surface, or both.
Foam Reach 1.8 How far a foam particle tints the surface around it, in particle radii.

With Collide With Obstacles on, whitewater collides with the scene’s ground planes, spheres, oriented boxes and mesh colliders, using each one’s friction and bounciness. Collisions happen in the obstacle’s own frame, so a moving obstacle carries whitewater along.

Stickiness (0.6) sets whether a droplet clings to a wet wall (1) or bounces off it using the surface’s bounciness (0). The analytic shapes are swept along each step, so a droplet at 40 m/s cannot pass through a thin wall.

Resimulate Whitewater replays the cached liquid through the pass with new settings, without re-simulating the liquid. The scene is re-read at each cached frame, so animated and baked obstacles are where they were.

Measured in isolation on a GTX 1060, per frame:

Pool Pass With a plane, a sphere, a box and a 40,000-sample mesh collider
40,000 particles (dam break) 7.5 ms 11.7 ms
1,000,000 particles 145 ms 198 ms

On the 10,000-particle dam break template, the defaults keep about 40,000 whitewater particles alive at the splash peak. While frames are being produced, the cached-sequence display objects are suspended, because re-importing each frame through Geometry Nodes for nobody to look at cost more than the pass itself.

The Hydro Solver also has its own Enable Whitewater switch. When the GPU pass is active, it replaces the older in-solver one, so the two never double up. The solver’s own whitewater settings (budget, spray velocity, foam curvature and so on) then are not used. Turning Enable Whitewater off on the Hydro node switches whitewater off.