Perlin noise: how it works, simplex vs Perlin, and the Noise Texture node in Blender
Short answer
Perlin noise is a gradient noise Ken Perlin invented in 1983: a grid whose points carry pseudo-random directions, dot products, then a blend through a smoothing curve. The result changes smoothly, and stacking octaves (fBm) gives clouds, rust or terrain. Simplex noise (2001) swaps the cubes for simplices and scales far better to high dimensions. In Blender, the Noise Texture node computes the improved Perlin noise of 2002.
- Noise Texture node: Shader Editor, Shift+A > Texture > Noise Texture (also in Geometry Nodes and the Compositor).
- Octaves: Detail (0 to 15), Roughness, Lacunarity.
- Terrain shapes: set Type to Ridged Multifractal, Hybrid Multifractal or Hetero Terrain.
- Render-time displacement: Displacement node, then Material Properties > Settings > Surface > Displacement (Cycles).
- Modifier: Add Modifier > Deform > Displace, Clouds texture, Noise Basis set to Improved Perlin.
Menu names below are checked against the Blender 5.2 manual and source code.
What is Perlin noise?
Perlin noise assigns every point in space a value that looks random but changes continuously. White noise, like Blender's White Noise Texture node, picks an unrelated value for each point; Perlin noise is coherent noise, so two nearby points get similar values. It is also deterministic, meaning a texture built on it is recomputed identically every frame without being stored, and its features are all roughly the same size, which is what lets you stack it at several scales.
Where Perlin noise comes from: Tron, 1983 and an Oscar
Ken Perlin says he started thinking seriously about procedural textures while working on Tron at MAGI in Elmsford, New York, in 1981, frustrated that everything looked machine-like. In 1983 he wrote a noise function that fills all of 3D space, with a range of -1 to +1 like sine and cosine. He presented it in a SIGGRAPH 84 course, then in the paper "An Image Synthesizer" at SIGGRAPH 85 (marble, water waves, fire, clouds). By his account, noise-based shaders were standard in commercial software by around 1988, and he never patented it.
In 1997 the Academy of Motion Picture Arts and Sciences gave him a Technical Achievement Award "for the development of Perlin Noise, a technique used to produce natural appearing textures on computer generated surfaces for motion picture visual effects," as quoted on his New York University page.
How Perlin noise works: gradient noise step by step
- The grid. Space is cut into unit cubes; find the eight corners, at whole-number coordinates, of the cube that contains the sample point.
- The gradients. Each corner gets a pseudo-random direction, picked in the original code through a 256-entry permutation table.
- The dot products. For each corner, take the dot product of its gradient with the vector from the corner to the sample point: eight values.
- The blend. Interpolate those values by the point's position inside the cube, through a smoothing curve rather than a straight line, so neighboring cubes join without a crease.
At a corner the vector to the point is zero, so the value is too: gradient noise is zero on every grid point and ripples in between. Value noise, by contrast, puts random values on the grid points (more on that below).
The fade curve: from 3t² - 2t³ to 6t⁵ - 15t⁴ + 10t³
In his 2002 paper "Improving Noise," Ken Perlin fixed two flaws. The original blending curve, 3t² - 2t³, has a second derivative (6 - 12t) that is not zero at 0 or 1, which creates discontinuities across cube faces that show up when the noise displaces a shaded surface. The new curve, 6t⁵ - 15t⁴ + 10t³, has zero first and second derivatives at both ends, which matters whenever noise drives bump or displacement. Second, gradients nearly aligned with the axes could clump into unusually strong spots, so the random gradient table gave way to twelve fixed directions, from the center of a cube toward its edges. The paper also measured the new version about 10% faster.
Why the noise reads 0.5 at whole numbers
The Blender manual describes a gotcha that follows from this: objects placed on a grid at whole-number positions, with a material that reads the noise at their location, all get 0.5, the grid points' zero remapped to the 0 to 1 range (fixes in the FAQ). A plane tilted slightly off an axis can also reveal the grid as banding; rotating the coordinates by an arbitrary amount gets rid of it.
Octaves and fBm: frequency, amplitude, lacunarity, persistence
One layer of noise gives soft blobs, all at one scale. For detail, you add octaves, each with a higher frequency (smaller features) and a lower amplitude than the one before: that sum is fBm, fractal Brownian motion. Lacunarity multiplies the frequency from one octave to the next, persistence (or gain) multiplies the amplitude. For his 1989 hypertextures, Ken Perlin doubled the frequency and halved the amplitude at each step, which are exactly Blender's defaults for Lacunarity (2) and Roughness (0.5).
| Concept | In the Noise Texture node | Effect |
|---|---|---|
| Base frequency | Scale (default 5) | Higher means smaller features |
| Octave count | Detail (default 2, range 0 to 15) | More fine grain, more computation |
| Persistence | Roughness (default 0.5) | Weight of the fine octaves, 0 to 1 |
| Lacunarity | Lacunarity (default 2) | Scale step between octaves |
The manual calls Detail the number of octaves, but the Cycles loop computes one more: Detail 0 gives a single octave, Detail 2 gives three. A fractional part blends between the two neighboring counts.
fBM, multifractals and Hetero Terrain
- fBM adds the octaves together for an even, isotropic result. It is the only type that shows Normalize, on by default, which keeps the output between 0 and 1; turned off, the range is at most -(Detail + 1) to Detail + 1.
- Multifractal multiplies them, so roughness varies by location like real terrain.
- Hybrid Multifractal mixes addition and multiplication: peaks rising out of flat plains.
- Ridged Multifractal takes the absolute value and flips it: sharp ridges.
- Hetero Terrain is close to Hybrid, with shapes that look like river channels.
These modes come from the Musgrave Texture node, removed in Blender 4.1. Old files convert automatically: the former Dimension becomes Roughness = Lacunarity^-Dimension, and Detail drops by 1. The last three types add an Offset input, Hybrid and Ridged a Gain input.
Simplex vs Perlin noise
Ken Perlin presented simplex noise in his SIGGRAPH course notes in 2001 (the provisional patent application is dated January 10, 2001). The patent lists what he saw wrong with the original: 24 multiplications per sample in 3D, a grid you can spot once the domain is rotated, and a cost that more than doubles with each added dimension.
Simplex noise works on a grid of simplices: triangles in 2D, tetrahedra in 3D. The cube around the point is split into six tetrahedra, sorting the coordinates picks the right one, and each of its four corners contributes through a spherical falloff; the contributions are summed rather than interpolated. Perlin's own summary: the cost grows as O(n²) instead of O(2ⁿ), so it runs a lot faster in 4D or 5D.
| Perlin noise | Simplex noise | |
|---|---|---|
| Grid | Squares, cubes, hypercubes | Triangles, tetrahedra, simplices |
| Points read per sample | 2ⁿ: 4 in 2D, 8 in 3D, 16 in 4D | n + 1: 3, 4 and 5 |
| Blending | Smoothed interpolation | Sum of spherical kernels |
| Cost in n dimensions | O(2ⁿ) | O(n²) |
| Artifacts | Grid visible when the domain is rotated | No visible grid, per the patent |
| Patent | None | US 6,867,776, expired in 2022 |
| In Blender | Noise Texture | Not available |
US patent 6,867,776, "Standard for perlin noise," granted in 2005, is listed as expired by Google Patents, with an anticipated expiration of January 8, 2022 (a status Google gives without legal analysis). In 2014 Kurt Spencer released OpenSimplex, which he describes as "developed in order to overcome the patent-related issues surrounding Simplex noise, while continuing to also avoid the visually-significant directional artifacts characteristic of Perlin noise," and put his code in the public domain; OpenSimplex2 is its successor.
Simplex or Perlin: which one should you use?
In Blender there is nothing to choose: the Noise Texture only computes Perlin noise. If the grid shows, rotate the coordinates with a Mapping node, raise Detail or add a little Distortion. In a hand-written shader or a game engine, simplex noise or OpenSimplex2 pays off mostly in 4D and above, or when the noise is evaluated a very large number of times.
Value noise, Worley and Voronoi: the other noises
- Value noise puts a random value on each grid point and interpolates. Marc Olano (University of Maryland, Baltimore County) notes it has significant low-frequency content: easier to build in hardware, lower in quality than gradient noise.
- Worley noise, or cellular noise (Steven Worley, SIGGRAPH 1996), measures the distance to randomly scattered points and draws cells. In Blender that is the Voronoi Texture node (F1, F2, Smooth F1, Distance to Edge, N-Sphere Radius), fractal since 4.0 and several times faster since 5.0, at the cost of a different pattern.
- Gabor noise (Gabor Texture) draws bands you can orient; the manual calls it more expensive than the Noise Texture when all you need is noise with no direction.
Blender's legacy textures, in the Texture Properties tab, name Perlin outright: the manual describes the Clouds type as Perlin noise, and its Noise Basis menu offers Original Perlin and Improved Perlin. The type called Noise is true random noise that changes every frame.
The Blender Noise Texture node, setting by setting
In the Shader Editor, Shift+A > Texture > Noise Texture adds the node; it also exists in the Compositor and in Geometry Nodes, where Vector reads point positions when left unconnected. According to Blender's source, the implementation is functionally identical in Cycles, EEVEE, OSL and Geometry Nodes. In Cycles (intern/cycles/kernel/svm/noise.h) the code is headed "Perlin Noise": fade curve 6t⁵ - 15t⁴ + 10t³, gradients picked by hashing the integer coordinates instead of a permutation table, and the result remapped to 0 to 1.
- Vector: Generated coordinates by default, 0 to 1 across the object's bounding box. W is used in 1D and 4D.
- Scale multiplies the coordinates: at 5, five grid cells across the object with Generated.
- Distortion offsets the coordinates with another noise, for a twisted, liquid look.
- Dimensions: 1D (W), 2D (Z ignored), 3D (default) or 4D. Higher dimensions render slower.
- Outputs: Factor, and Color, with a different noise in each channel.
The noise has no seed, as the Cycles code points out. For a variation of the same pattern, shift the coordinates with the Location input of a Mapping node (Add > Utilities > Vector > Mapping), or switch to 4D and change W; animating W makes the pattern evolve in place.
Normalize and Lacunarity arrived in Blender 4.0, whose release notes say Normalize is meant for colors or blend factors and is not needed for bump or displacement. The Shader Editor basics are in the guide to textures in Blender, and the Principled BSDF in the guide to materials in Blender.
Step by step: Perlin noise terrain
- Add a plane (Add > Mesh > Plane) and scale it up.
- Add Modifier > Generate > Subdivision Surface in Simple mode, which the manual suggests for adding resolution to a mesh meant for displacement, with a high Render level. In Cycles, tick Adaptive Subdivision instead, no longer experimental since Blender 5.0.
- In the Shader Editor, add a Noise Texture: Type set to Hetero Terrain or Ridged Multifractal, Scale around 2 or 3, Detail around 8.
- Add Add > Displacement > Displacement: Factor into Height, its output into the Displacement socket of the Material Output. Midlevel (default 0.5) is the value that displaces nothing; Scale sets the height.
- In Material Properties > Settings > Surface, set Displacement to Displacement Only. By default Blender only does bump mapping, so the silhouette would stay flat.
- Also run Factor through a Color Ramp (Add > Color), valleys on the left and peaks on the right, into the Base Color of the Principled BSDF. Render with F12.
EEVEE does not support Displacement Only and falls back to Displacement and Bump, evaluated on every sample. Subdivision itself is covered in the guide to the Subdivision Surface modifier.
Variation: rust and bumps without subdivision
Run a Noise Texture (high Scale, Detail around 8) through a Color Ramp with its stops close together, into the Factor of a Mix Color node (Add > Color) between a metal color and a rust color. Feed the same Factor into the Height of a Bump node (Add > Displacement > Bump), and its Normal output into the Normal of the Principled BSDF. Bump only changes shading. How it compares with a normal map is explained in the guide to normal maps in Blender, and an AO node can confine the rust to crevices, as in the ambient occlusion guide.
Clouds and mist in a volume
Connect a Principled Volume to the Volume input of a cube's Material Output, and a Noise Texture run through a Color Ramp to its Density: the mist breaks up into drifts. To export a procedural result to another program, bake it to an image, as described in the guide to texture baking in Blender.
The Displace modifier with a noise texture
The Displace modifier moves vertices according to the intensity of a texture, so the shape shows in the viewport whatever the render engine, provided the mesh has enough vertices.
- Subdivide the object, then Add Modifier > Deform > Displace.
- Click New next to Texture and open the Texture Properties tab: set Type to Clouds and Noise Basis to Improved Perlin. Size sets the noise scale, Depth the detail (and the computation time).
- In the modifier, set Direction to Normal. The offset is (texture value - Midlevel) × Strength, and a negative Strength inverts the effect.
What noise costs in render time
- Detail: every octave is one more noise evaluation each time the shader runs; keep the lowest value that still shows at that distance.
- Dimensions, Distortion and Color: 4D costs more than 3D, Distortion adds one noise per axis and Color two more, computed only when that output is connected.
- Displacement: Displacement Only is the most accurate and most memory-hungry method; the manual names Adaptive Subdivision as the best way to subdivide.
For the other settings that weigh on render time, see how to render faster in Cycles.
Frequently asked questions
What is Perlin noise?
Perlin noise is a procedural noise function Ken Perlin created in 1983. It gives every point in space a pseudo-random value that changes smoothly, always the same for a given position, with features of roughly one size. Adding several octaves of it produces clouds, marble, rust or terrain.
How does Perlin noise work?
Space is divided into a grid and each grid point gets a gradient, a pseudo-random direction. For a sample point, you take the dot product of each nearby gradient with the vector from that grid point to the sample, then blend the results with a smoothing curve, 6t^5 - 15t^4 + 10t^3 since the improved version of 2002. The noise is zero on every grid point.
Simplex vs Perlin noise: what is the difference?
Simplex noise, which Ken Perlin presented in 2001, replaces the grid of cubes with a grid of simplices (triangles in 2D, tetrahedra in 3D) and sums n + 1 contributions instead of blending 2^n corners. It is much cheaper in 4D and above. The US patent that covered it has been expired since January 2022, according to Google Patents.
Is the Blender Noise Texture node Perlin noise?
Yes. The Blender 5.2 manual describes it as fractal Perlin noise, and the Cycles code implements the improved Perlin noise of 2002. According to the source code, EEVEE, Geometry Nodes and OSL compute the same function. Blender has no simplex noise option.
How do you make terrain with Perlin noise in Blender?
In Cycles, subdivide a plane, connect a Noise Texture (type Hetero Terrain or Ridged Multifractal) to the Height input of a Displacement node wired to the Displacement socket of the Material Output, then set Material Properties > Settings > Surface > Displacement to Displacement Only.
Why does the noise give several objects the same value?
Gradient noise is zero on its grid points, which becomes 0.5 once Blender remaps it to the 0 to 1 range, so objects sitting on whole-number coordinates all read 0.5. Change Scale, offset the coordinates or add a dimension; for a random value per object, use the White Noise Texture instead.
Rendering the animation on TURNA
When a scene is already well optimised and the frame count is what takes the time, the remaining lever is rendering several frames at once. TURNA does this for Blender: an add-on (Blender 4.0 to 5.2, Cycles and Eevee) sends the scene in one click, and the frames are split across 1, 2, 4 or 8 GPUs in parallel, RTX 5090 first and RTX 4090 when none is free. The add-on shows the estimated cost before anything starts. Prices start at €4.90 per hour, billed on the time actually used, with a 2-minute minimum (30 seconds until November 9), and new accounts get €25 of free credit. A single still image is still rendered by one machine, so the gain is on animations. Tiers and worked examples are on the Blender render farm page.



