HomeArticlesGenerative Art

Domain Warping: Turning Flat Noise into Marbled, Fluid-Like Fields

How feeding noise its own displaced coordinates — iterated two or three times — turns plain fBm into the swirling, marbled look used in terrain, clouds and marble shaders.

mysimulator teamUpdated June 2026≈ 7 min read▶ Open the simulation

Feeding noise its own coordinates

Plain fractal Brownian motion (fBm) — several octaves of Perlin or simplex noise summed at increasing frequency and decreasing amplitude — already looks organic, but it has a tell: every feature is still roughly aligned to the underlying grid the noise was sampled on, and the whole field looks isotropic and a little static. Domain warping, popularised by Ken Perlin and later written up extensively by Inigo Quilez, breaks that alignment with one idea: before sampling the noise function at a point p, displace p by another noise field first. The noise doesn't know its input coordinates were bent — it just evaluates wherever it's told to — which is exactly why the trick works.

live demo · warped fBm producing marbled, cloud-like flow● LIVE
// single-level domain warp
q = p + noise2D(p)                 // warp the coordinate with a noise field
result = noise2D(q)                // sample the SAME (or a different) noise at the warped point
// the warp field can itself be fBm for richer, multi-scale distortion

Iterating the warp

One level of warping already breaks grid alignment, but Quilez's key move was iterating it — feeding the result of one warp into another warp, recursively:

f(p) = fbm(p + f1)
where f1 = fbm(p + f2)
where f2 = fbm(p)
// three nested evaluations of the same noise function, each one warping
// the coordinate space the next evaluation is sampled in

Each additional level of nesting adds a further degree of large-scale coherent distortion on top of the previous one — the first warp bends the field into gentle curves, the second warp bends those curves into swirls, and by the third level you get the marbled, turbulent, cloud-and-smoke look that a single flat fBm layer can't produce no matter how many octaves you stack, because plain fBm's octaves are all still evaluated at undistorted coordinates and therefore stay statistically isotropic everywhere.

Two independent knobs: warp strength and warp scale

Warp strength is a scalar multiplier on the displacement — at zero you get back plain fBm exactly; small values (0.1–0.5 in normalised noise units) add a subtle organic wobble to boundaries; large values (2+) can tear the field into swirls so strong that the original structure is barely recognisable, useful for flame and turbulent-smoke looks. Warp scale — the frequency of the noise field doing the warping, independent of the frequency of the noise field being warped — controls the size of the distortion features: a low-frequency warp bends the whole field in broad sweeping curves (good for terrain and marble), while a high-frequency warp on the same base field produces fine, choppy turbulence (good for fire and roiling smoke). These two knobs are genuinely independent, and most of the visual variety in domain-warped art comes from exploring their combinations rather than from changing the base noise function at all.

Why it looks like fluid flow, not decoration

The resemblance to actual fluid motion isn't superficial. A displacement field built from coherent noise is, in effect, a smooth, divergence-heavy vector field — nearby points get pushed in similar directions, which is exactly the qualitative behaviour of advection in a low-Reynolds-number flow, even though no Navier–Stokes equation is anywhere in the code. That's the whole appeal: domain warping gets you 90% of the visual richness of an actual fluid simulation at a cost that's still just a handful of noise evaluations per pixel, with no pressure solve, no velocity field integration and no numerical stability concerns at all.

Practical use in terrain, clouds and marble

Warping a ridge-noise heightfield (fBm built from |noise| reflected around zero, producing sharp ridges) with a lower-frequency warp is a standard way to generate mountain ranges whose ridgelines curve and branch realistically instead of running in perfectly straight diagonal lines. Warping a value-noise field and colouring by the result with a simple two- or three-colour gradient produces convincing marble and wood-grain textures — the classic turbulence + sine marble shader is really just a one-dimensional slice of the same idea. Layering two or three octaves of warp at different scales on a cloud-density field, then thresholding, produces the fluffy, non-repeating cumulus look used in countless procedural sky shaders.

Frequently asked questions

What exactly does domain warping do differently from regular fBm?

Regular fBm sums several octaves of noise sampled directly at each pixel's coordinates, so features stay statistically aligned to the underlying grid. Domain warping first displaces those coordinates using a separate noise field before sampling, so the noise function never sees the original grid-aligned input — this is what produces the swirling, marbled look instead of a flat, isotropic texture.

Why does iterating the warp (nesting it two or three times) look so different from a single warp?

Each nested warp bends the coordinate space that the next evaluation samples from, so distortions compound. One warp adds gentle curvature; warping the warp itself adds swirls on top of those curves; a third level produces the marbled, turbulent look that no amount of additional fBm octaves at fixed coordinates can reproduce, because plain octaves are always evaluated at undistorted positions.

Does domain warping actually simulate fluid dynamics?

No — there's no pressure solve or velocity integration involved, it's purely a coordinate displacement trick. But a coherent noise displacement field behaves qualitatively like a smooth advection field, which is why the results look convincingly fluid-like at a tiny fraction of the computational cost of an actual Navier-Stokes fluid simulation.

Try it live

Everything above runs in your browser — open Domain Warping and change the parameters while it is running. Nothing is installed, nothing is uploaded, the whole model lives in one tab.

▶ Open Domain Warping simulation

What did you find?

Add reproduction steps (optional)