Procedural Noise Phenomena

A shot needs a lazy drift of smoke across a lantern, dust motes swirling in a shaft of light, ripples skimming a pond, wind combing a wheat field, the flicker of a distant campfire. You could reach for a fluid solver — grid the air, march pressure and velocity, wait for it to bake. But for a background element that nobody is staring at, that is a sledgehammer for a thumbtack. The cheaper, older, and often more art-directable trick is procedural noise: coherent pseudo-random fields that look like turbulence, evaluated on demand at any point in space and time with a handful of arithmetic — no solver, no memory, no bake, and infinite non-repeating detail.

This page is about faking natural phenomena with noise instead of physics. We meet the building blocks — coherent noise, fBm and turbulence, and domain warping — then the beautiful special case of curl noise, which advects particles as if the air were an incompressible fluid, with no solver at all. Along the way we keep one honest fact in view: noise is not a simulation. It builds on the coherent value/Perlin noise you have met, and on Perlin noise for motion.

Why not just random?

White noise — an independent random number at every pixel — is useless for natural look: it is pure static, all high frequency, no shape. Natural phenomena have structure at a scale: a cloud is smooth up close and lumpy far out; smoke has big rolling masses carrying fine wisps. What we want is coherent, band-limited randomness — random, but smooth, so nearby points have nearby values and the field varies over a controllable length scale.

Perlin noise (Ken Perlin, 1983, and his 2001 simplex refinement) is the canonical example: interpolate random gradients placed on a lattice, so the output is smooth and has no visible grid. One octave of it is a gentle, blobby field — exactly the raw clay we sculpt with next.

fBm and turbulence: stacking octaves

A single octave is too smooth to read as nature. The fix is to sum copies of noise at increasing frequency and decreasing amplitude. Each copy is an octave: double the frequency, halve the amplitude. The result is fractional Brownian motion (fBm) — the self-similar roughness of coastlines, mountains and clouds.

\text{fBm}(x) \;=\; \sum_{i=0}^{N-1} \frac{\text{noise}\!\left(2^{i}\,x\right)}{2^{i}} \;=\; \text{noise}(x) + \tfrac12\,\text{noise}(2x) + \tfrac14\,\text{noise}(4x) + \cdots

The first octave lays down the big shapes; each further octave sprinkles finer, fainter detail on top. The ratio of successive frequencies is the lacunarity (here 2) and the ratio of successive amplitudes is the gain or persistence (here \tfrac12). Turning up the octave count adds crinkle without changing the overall silhouette — because the extra octaves are small.

Turbulence is the same sum with the absolute value of each octave, \sum_i |\text{noise}(2^i x)| / 2^i. The |\cdot| creates sharp creases where the noise crosses zero — the billowy, flame-like, marbled look Perlin used for his famous procedural marble and fire.

Because most natural rough surfaces have a power-law spectrum: energy falls off as frequency rises, roughly as 1/f. Doubling frequency while halving amplitude reproduces exactly that 1/f falloff, which is why fBm looks "right" for mountains and clouds. Change the gain and you change the fractal dimension: a gain near 1 keeps every octave loud and gives a jagged, rocky field; a small gain fades detail fast and gives soft, rolling hills. The persistence knob is the roughness knob.

Build fBm yourself

Below is a genuine 1D fBm curve, computed live in your browser from a simple deterministic value-noise (a hashed lattice, smoothly interpolated — no Math.random, so it is the same every reload). The faint line is a single octave — smooth and blobby. The bold curve is the fBm sum. Drag the octaves slider from 1 upward and watch each new octave stipple finer wiggles onto the same big shape without moving it.

At one octave the curve could be a gentle hill; by five or six octaves it has the crinkled, self-similar texture of a mountain ridge or a cloud edge — and every added octave contributes at most 2^{-i} of the amplitude, so the silhouette stays put while detail piles on. That controllability is the whole appeal: one slider, infinite believable roughness.

Domain warping: noise into noise

Plain fBm is isotropic — wiggly, but without the flow of real smoke, where masses curl and stretch. Domain warping adds that flow for almost free: instead of sampling the field at x, sample it at a position that has itself been displaced by noise.

f(\mathbf{p}) \;=\; \text{fBm}\!\Big(\mathbf{p} + \alpha\,\text{fBm}(\mathbf{p})\Big)

Feeding noise into the coordinates of noise drags the field around, producing the billowing, smeared, marbled tendrils that read as smoke and clouds. Nest it twice — warp the warp — and you get the swirling, organic look Inigo Quilez popularised for shader clouds. It is still just a stack of cheap noise calls; no dynamics, only a clever change of coordinates.

Curl noise: divergence-free flow with no solver

Here is the trick that makes noise look genuinely fluid. If you advect particles by a raw noise velocity field, they clump: the field has sources and sinks (non-zero divergence), so particles pile up in some places and thin out in others — the density goes blotchy, which the eye reads as "not a fluid". Real incompressible flow has zero divergence everywhere, which is what keeps smoke and dust looking evenly dense as they swirl.

Curl noise (Robert Bridson, Ringold & Marschner, SIGGRAPH 2007) gets that for free. Take a scalar noise potential \psi and use its curl as the velocity. In 2D, with potential \psi(x,y):

\mathbf{v} \;=\; \nabla \times \psi \;=\; \left(\frac{\partial \psi}{\partial y},\; -\frac{\partial \psi}{\partial x}\right)

The payoff: cheap smoke, dust, mist and magical swirls that swirl the way incompressible fluid does, evaluated per particle with zero global solve. Bridson's paper adds the neat extra that you can ramp the potential to zero near boundaries so the flow slides along obstacles — still with no solver. It is the workhorse of "fluid-ish" effects that don't need to be exact.

Why curl and not just "pick a divergence-free field"? Because the curl construction guarantees the property by identity, for any noise you throw at it — including fBm and domain-warped potentials — so you keep all the art-directable detail of noise and get incompressibility thrown in for free.

Making it live: animate the field over time

A still noise field is a texture; a moving one is an effect. Two standard ways to breathe life into it:

Combine the two — a slow scroll plus a slow evolve — and a curl-noise velocity field, and you have a living, swirling, evenly-dense ambient effect for a handful of noise calls per particle per frame.

This is the one misconception to nail. Noise looks like fluid, but it has no dynamics. There is no pressure, no incompressibility being solved (curl noise merely constructs a divergence-free field, it does not respond to anything), no collisions, no conservation of mass or momentum, no reaction to forces in the scene. A curl-noise smoke plume will happily pass straight through a wall, ignore a moving character, and never billow because of heat — it billows because you told it to, everywhere, unconditionally.

So the rule of thumb is: use procedural noise for ambient and background phenomena — distant clouds, atmospheric dust, gentle water shimmer, wind on grass, a flickering torch — where nothing needs to interact. When a phenomenon is a hero element that must collide, pour, splash against geometry, or respond to the action, simulate it with a real solver. Many productions do exactly this hybrid: solve the hero fluid, and fill the background with cheap noise. Noise is infinite, controllable and free; it is simply not physics.

The trade-off, summarised

DimensionProcedural noiseFluid simulation
CostA few arithmetic ops per point; no bakeGrid/particle solve, heavy, baked
DetailInfinite, non-repeating, any resolutionLimited by grid/particle resolution
ControlArt-directable knobs (octaves, gain, warp)Indirect — tune forces, then re-solve
InteractionNone — ignores the sceneCollides, pours, reacts to forces
AccuracyPlausible look only, no real physicsConserves mass/momentum; physically grounded
Best forAmbient / background phenomenaHero elements that must interact