Low-viscosity liquids
FLIP-leaning, APIC transfer, light pressure iterations. Splashes, pours, droplets — surface tension on, vorticity confinement to recover lost curl.
Undine Beta · CUDA 12 · Blender 5.x
A CUDA-accelerated FLIP / PIC / APIC liquid solver for Blender. Iterate at realtime speeds on water presets where you used to wait minutes per frame, then add one-way Whitewater FX for spray, foam, bubbles, and aerated water without contaminating the primary solve.
// origin
I bought the most popular fluid addon for the film I was working on. Decent results, but minutes per frame. Sims I'd leave running overnight only to find out, the next morning, that the timing wasn't what I wanted. Days lost per test. Weeks with no real progress.
The question was simple: the tech to simulate in real time already exists — APIC, MLS-MPM, GPU multigrid pressure, sparse bricks. Someone just had to bring it into Blender in a way that's usable, solid, and built for artists, not for paper benchmarks.
Undine is that bridge. A custom C++20 / CUDA 12 core, a Python addon that never blocks the simulation loop, and a debug panel that tells you the truth — CFL, residual, divergence — before you commit to a bake.
— Mario Martín · Undine author
// solver core
A solver is only as good as the numbers it exposes. Undine exposes its — every transfer, every iteration, every substep retry.
flip_ratio: lean PIC for honey, lean FLIP for thin water.C matrix that preserves angular momentum across long advections — vortices stop dying after 20 frames.√N avoids spinning iterations against numerical noise.ω = ∇×v, normalize, restore lost rotation. Recovers small-scale curl without injecting energy..velocities automatically — Lagrangian, sourced from the solver's own field. Enable Motion Blur in your renderer; the blur is already physically aligned with the sim.# GPU profile @ step 128, 8.1M particles
P2G 0.41 ms
pressure 1.82 ms (PCG, 14 iter, MG V-cycle)
G2P 0.38 ms
collisions 0.12 ms (SDF, 2 colliders)
vorticity 0.08 ms
D2H 0.00 ms ← was 2.32 ms
───────────────────
total 2.81 ms → 15.2 FPS
# numerical health
CFL 0.42
‖∇·u‖∞ 3.4e-5
residual 1.2e-6 (floor 8.5e-4 · √N · ε_f32)
retries 0
cells 1,204,832
bricks 3,210 (velocity_pages, halo=1)
// streamflow
Streamflow turns the simulation into a live stream. As substeps complete on the GPU, particle frames flow into Blender's playback without ever leaving the device until you ask for them. You scrub, tweak, and re-run in seconds — not in the next sitting.
Pick the rhythm: Streamflow Points for a cheap live point cloud, or Mesh Every Frame for lockstep meshing using the preset visible in the Meshify tab. The runtime contract guarantees the preset you see in the panel is the preset that ran — no silent fallbacks to a faster-but-cruder profile.
final_hero / final_ultra presets
// whitewater fx beta
Whitewater FX (Beta) adds secondary particles for spray, foam, bubbles, and aerated whitewater without changing the real fluid mass. The primary FLIP/APIC particles remain the water that participates in P2G, G2P, pressure, viscosity, reseeding, density correction, primary cache, and Meshify.
Secondary particles are generated one-way from the water's motion: velocity, impact, approximate turbulence, surface proximity, and splash zones can emit detail, but the particles never return forces or volume to the solver, never enter pressure, never change the real water count, and never become blobs in the mesh.
<run>/whitewater/frame_XXXXXX.gpfb cache with kind, age, radius, velocity, and id attributes
// materials
The same solver core covers Newtonian fluids, viscoplastic rheology, and MPM-style elastoplastics. The presets are starting points, the sliders take you the rest of the way.
FLIP-leaning, APIC transfer, light pressure iterations. Splashes, pours, droplets — surface tension on, vorticity confinement to recover lost curl.
PIC blend up, viscosity solver enabled, drag tuned. Slow, cohesive flow. CFL stays low, substeps go up, the solve runs more conservatively to hold shape.
Surface tension cranked, friction added, rheology on. The fluid looks like it remembers where it came from — useful for VFX shots that need character.
Per-particle Neo-Hookean stress, deformation gradient F. Compresses, fractures, stays compressed. The same stage that handles water handles snow — only the constitutive law changes.
Stiffer Young's modulus, lower Poisson, plasticity threshold. Holds folds, creases. Cream, butter, clay — anything between fluid and soft solid.
Tune the parameters, hit Save New in the preset library, name it after the shot. Built-in presets are locked; your custom presets travel with the .blend.
// 30×
The win wasn't a faster kernel — it was deleting the round-trip. P2G density correction now runs fully on device, the pipeline never drops back to the CPU, and the per-substep D→H copy that was eating 87% of the frame time disappeared.
Measured on an emitter + static SDF collider scene, 8.1M particles, RTX 4070, P2G density mode, PCG + V-cycle multigrid.
// diagnostics
Every substep exposes CFL, Poisson residual, mean and absolute divergence, active cell count, brick state, retry chain step, and CPU↔GPU match. If a scene is going to blow up, you see it while previewing, not four hours into the bake.
[GPU PROF] per-stage timings, exportablecode=4 max_iters → FP64 → MG → CPUdense_only · velocity_pages · demoted reason
// who it's for
Iterate secondary fluid timing without blocking the main render. The Alembic ships with per-vertex .velocities: correct motion blur on the first render, no auxiliary AOVs, no Geometry Nodes scaffolding.
Live client reviews. Tweak viscosity, gravity, surface tension or emission and the next playback shows it — not the next meeting. Streamflow keeps the viewport honest.
Small teams that can't afford an 8h overnight bake just to find out the timing was wrong. One GPU, one license, one Blender instance — the whole pipeline fits on a workstation.
// beta
You're buying the 0.0.x release with guaranteed access to 1.0 at no extra cost. This is the lowest price Undine will ever have — when the solver leaves beta, the price moves with it.