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.
How it works
Section titled “How it works”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.
Caching and rendering
Section titled “Caching and rendering”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.
velocityis 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.
Settings
Section titled “Settings”| 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. |
Collisions
Section titled “Collisions”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.
Re-simulate Whitewater
Section titled “Re-simulate Whitewater”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 older in-solver whitewater
Section titled “The older in-solver whitewater”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.