Undine Beta · CUDA 12 · Blender 5.x

Live fluid iteration, inside Blender.

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.

water fast-path
up to 15FPS
vs. CPU baseline
~30×
test scene
8.1M parts
RTX 4070
refGPU
blender · undine · streamflow viewport
Real-time preview of the Undine fluid solver inside Blender
// p2g 0.41ms · pressure 1.82ms (PCG · MG · 14it) · g2p 0.38ms · D2H 0.00ms

// origin

I built it because no Blender solver let me iterate.

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

What runs under the hood.

A solver is only as good as the numbers it exposes. Undine exposes its — every transfer, every iteration, every substep retry.

Methods

Hybrid FLIP / PIC
FLIP for detail, PIC for stability. Per-scene flip_ratio: lean PIC for honey, lean FLIP for thin water.
APIC transfer
Affine particle-to-grid. Each particle carries a 3×3 C matrix that preserves angular momentum across long advections — vortices stop dying after 20 frames.
Viscous Newtonian & Rheology
Configurable kinematic viscosity (logarithmic 0-100% mapping to m²/s). Newtonian, Bingham-style, and Herschel-Bulkley rheology presets for production honey, chocolate, slime. Host-authoritative implicit routes where needed. EVP and full elastoplastic MPM families (snow, dough, cream) are post-beta roadmap items.
PCG + GPU Multigrid pressure
Preconditioned conjugate gradient with optional V-cycle multigrid (sym. RBGS smoother). FP32 tolerance floor scaled by √N avoids spinning iterations against numerical noise.
P2G density correction
Volume drift correction on GPU where supported. Water fast-path tested at ~15 FPS (8.1M particles, RTX 4070) vs. ~0.5 FPS baseline.
Vorticity confinement
Fedkiw-style two-pass grid op: ω = ∇×v, normalize, restore lost rotation. Recovers small-scale curl without injecting energy.
Sparse Bricks
Active simulation regions tracked as bricks with a halo. Empty space costs nothing; the solver only allocates and moves the cells that are actually occupied.
Scale-aware resolution
Separates voxel size from domain size. Fixed Voxels Per Meter keeps physical resolution stable — small domains become cheaper, not accidentally expensive. Cinematic Scale Lock preserves visual motion across artistic domain resizing.
SDF collisions
Baked or animated SDFs, configurable boundary band, multi-collider, contact refill. CUDA-accelerated bake for animated colliders (slabs sized to dodge Windows TDR).
Anisotropic meshing
DENSITY_MC scalar route with covariance-matrix anisotropy: per-particle ellipsoids elongated along velocity. Fluid surfaces look like sheets and drips, not marbles.
Native Alembic motion blur
Meshify writes per-vertex .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.
Substep retry chain
If pressure breaks down (max iters, NaN, FP32 plateau), the solver promotes the substep through a deterministic chain: retry → FP64 → MG → CPU. You see the path in the log, not a crash.

Live

# 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

The viewport is the bake.

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.

  • Live particle cache, GPU-resident between frames
  • Lockstep mesh preview with final_hero / final_ultra presets
  • SNAP playback keeps the viewport in step with the solver
  • SNP5 / wire v6 streams secondary whitewater payloads separately from primary water
  • Per-frame triangle count and frame counter — so you see meshing happen
  • Cancel mid-run; cached frames stay valid
Streamflow live preview running inside the Blender viewport
// streamflow · solver and meshifier sharing one cache

// whitewater fx beta

Spray, foam, and bubbles as a safe visual layer.

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.

  • Spray for airborne droplets from impacts, jets, waterfalls, and fast wakes
  • Foam for surface accumulation over wakes, turbulent edges, and impacts
  • Bubbles for underwater aeration with buoyant upward motion
  • Separate <run>/whitewater/frame_XXXXXX.gpfb cache with kind, age, radius, velocity, and id attributes
  • Independent Blender viewport toggles for fluid, spray, foam, and bubbles
Undine viewport preview with secondary whitewater particles
// one-way secondary particles · meshify consumes primary water only

// materials

From thin water to elastoplastic dough.

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.

water

Low-viscosity liquids

FLIP-leaning, APIC transfer, light pressure iterations. Splashes, pours, droplets — surface tension on, vorticity confinement to recover lost curl.

honey

Viscous Newtonian

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.

slime

Stylized cohesive

Surface tension cranked, friction added, rheology on. The fluid looks like it remembers where it came from — useful for VFX shots that need character.

snow

Elastoplastic MPM

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.

dough

Plastic deformable

Stiffer Young's modulus, lower Poisson, plasticity threshold. Holds folds, creases. Cream, butter, clay — anything between fluid and soft solid.

custom

Save your own

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×

0.5 FPS → 15 FPS. Same scene, same particle count.

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.

CPU + mixed path
D2H ~2.32 ms · 87% bottleneck
0.5 fps
GPU-resident pipeline
D2H eliminated · device-only
15.0 fps

Measured on an emitter + static SDF collider scene, 8.1M particles, RTX 4070, P2G density mode, PCG + V-cycle multigrid.

// diagnostics

No black box. Instability shows up before the bake.

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.

  • Live [GPU PROF] per-stage timings, exportable
  • Per-substep CFL and pressure residual in the panel
  • Retry-chain visibility: code=4 max_iters → FP64 → MG → CPU
  • Brick authority state: dense_only · velocity_pages · demoted reason
  • Override readouts: when a scene drifts away from its preset, you see which control did it
  • CPU↔GPU match for catching numerical drift between paths
Screenshot of the Undine diagnostics panel
// diagnostics panel · CFL, residual, divergence, brick state, retry chain

// who it's for

Three kinds of project where Undine changes the rhythm.

01

Cinematic and VFX

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.

02

Advertising and motion design

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.

03

Indie production

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

Planned beta price: $69 USD.
Updates through 1.0 included.

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.