Fields, noise, and flow
Perlin Noise
A coherent scalar field made from local variation and smooth interpolation.
What it is
Ken Perlin introduced noise as a controllable procedural function for building natural-looking variation rather than storing a texture image. Unlike independently chosen random values, nearby samples are related: moving the input a little moves the output a little. [1]
Canonical two-dimensional gradient noise divides the plane into integer lattice cells. A deterministic hash assigns each corner a pseudo-random gradient vector; at a query point, each corner contributes a dot product between its gradient and its offset to the point. The four contributions are smoothly blended.
Mathematical construction
Write i = floor(p) and f = p − i, with f in a unit cell. For corner c, use dc = gi+c · (f − c), then interpolate the four dc values in x and y. Perlin’s improved fade is q(t) = 6t5 − 15t4 + 10t3; its first and second derivatives vanish at cell edges, reducing seams where the field is differentiated. [2]
Frequency comes from input scale: N(sx, sy) has features roughly s times smaller than N(x, y). Multiple octave bands may be summed—Σ akN(2kx, 2ky)—to create broad and fine structure; this is a design choice, not a requirement.
Reading the field
The diagram makes the internal lattice visible. The fade curve hides its joins, while corner gradients establish local slope. A seed changes gradient assignments, scale changes feature size, and output remapping changes contrast without changing spatial organisation. Gradient noise differs from white noise because it is spatially correlated; geometry and rendering still decide what field values become.
Structural use
- Continuity. Organise drawing without abrupt cell-to-cell change.
- Direction and gradients. Turn field values into heights, thresholds, angles, contours, or flow vectors.
- Procedural modelling. Displace surfaces, modulate density, vary lengths, and combine with fixed geometry reproducibly.
- Time. Sample a third coordinate for continuous evolution instead of flickering independent frames.
Algorithmics note. “Perlin” is often used loosely. Implementations should distinguish gradient noise from simpler hashed-value noise with smooth interpolation: both are coherent, but their local behaviour differs.