Fact-checked by Grok 2 weeks ago

Simplex noise

Simplex noise is a gradient-based for generating coherent, pseudo-random suitable for synthesis in and related fields, utilizing a simplicial structure to evaluate values at arbitrary points in n-dimensional space. Developed by Ken Perlin, it addresses key limitations of his earlier classic function from 1983, which relied on hypercubic lattices and suffered from increasing in higher dimensions. Introduced in 2001 during a presentation at the conference, simplex noise employs the simplest polytopes—known as simplices (e.g., line segments in 1D, triangles in , tetrahedra in )—as its fundamental grid elements, enabling efficient evaluation without the exponential scaling issues of hypercube-based methods. The algorithm primarily addresses the computational complexity of the original noise in higher dimensions while also reducing directional artifacts through improved and gradient selection, resulting in smoother gradients and faster computation times. Its computational complexity is linear in the number of dimensions, O(n), compared to O(2^n) for classic , making it particularly advantageous for , 4D, and higher-dimensional applications such as animation, terrain generation, and fluid simulations. At a high level, the simplex noise process involves skewing input coordinates to align with the simplex grid, identifying the containing simplex through coordinate sorting, and computing a weighted sum of contributions from each simplex vertex using precomputed gradient vectors and a radial fade function to ensure continuity and isotropy. This design not only enhances visual quality by producing more uniform noise distributions but also facilitates hardware implementation and mathematical standardization, as the fixed gradient sets eliminate variability in reference implementations. Widely adopted in graphics software and game engines, simplex noise remains a foundational tool for creating natural-looking procedural content due to its balance of efficiency and aesthetic output.

Introduction

Definition and purpose

Simplex noise is a type of gradient function that generates continuous values at arbitrary points in n-dimensional space, producing isotropic textures suitable for . Developed by Ken Perlin, it evaluates a scalar output typically normalized to the range [-1, 1], where values represent smooth variations that can be visualized as undulating gradients in or spaces. For example, in two dimensions, a slice of simplex appears as a field of soft, flowing hills and valleys without sharp edges, while in three dimensions, it forms volumetric clouds or terrain with organic continuity. The primary purpose of simplex noise is to create natural-looking patterns for applications in , simulations, animations, and procedural content generation, such as terrain modeling or . It excels in avoiding directional biases and grid-aligned artifacts that can occur in higher dimensions, ensuring more uniform randomness that mimics real-world phenomena like wind patterns or fluid motion. This makes it particularly valuable for multidimensional uses, where earlier gradient noise methods like classic suffer from increased computational demands and visible anisotropies as dimensionality grows. A key innovation of simplex noise lies in its lattice structure, which employs simplices—triangles in and tetrahedra in —rather than hypercubes, resulting in fewer evaluation points per and better to higher dimensions. This simplex-based approach contributes to its efficiency and the production of seamless, artifact-free textures that enhance realism in procedural environments.

Historical development

Simplex noise was invented by Ken Perlin in 2001 as an enhancement to his original Perlin noise algorithm from 1983. Perlin introduced the method in his paper "Noise Hardware," presented as part of the Real-Time Shading course notes at SIGGRAPH 2001. The primary motivation was to mitigate the escalating computational overhead and directional artifacts inherent in classic Perlin noise when applied to dimensions higher than 2D or 3D, enabling more efficient gradient-based procedural texturing. In conjunction with the development, Perlin filed a provisional U.S. (Ser. No. 60/260,751) on January 10, 2001, followed by non-provisional application 10/042,647 on January 8, 2002, which was granted as U.S. 6,867,776 on March 15, 2005, specifically covering the Simplex noise algorithm and its hardware-optimized implementations for . The patent term extended 20 years from the filing date, with adjustments leading to expiration on January 10, 2022. Prior to expiration, licensing concerns prompted the creation of alternative implementations, such as in 2014, designed as a patent-free variant with similar properties. Following the patent's expiration in 2022, Simplex noise implementations are no longer subject to licensing restrictions.

Comparison with other noise functions

Perlin noise

Classic , developed by Ken Perlin in 1983, is a foundational gradient noise function in , designed to produce smooth, organic variations resembling natural phenomena such as clouds, terrain, or fire. It achieves this by layering pseudo-random gradients across a regular hypercubic , where the noise value at any point is derived from interpolated contributions of these gradients, ensuring continuity and avoiding sharp discontinuities found in earlier generators. The function's smooth , using a cubic Hermite fade curve f(t) = 3t^2 - 2t^3, results in a bandpass-filtered output that mimics the spectral characteristics of natural textures. The core components of classic include lattice points with precomputed random unit gradients, distance vectors from the evaluation point to each corner, and attenuation weights based on the point's position within the cell. In 2D, combines four corner contributions; in 3D, uses eight. Each contribution is the of the lattice gradient and the offset vector to the point, scaled by the product of fade functions applied to the adjusted for each corner. This process repeats across octaves for fractal-like effects. The mathematical formulation for an n-dimensional point \mathbf{p} involves identifying the containing with coordinates \mathbf{X} = \lfloor \mathbf{p} \rfloor, then summing over the $2^n corners: N(\mathbf{p}) = \sum_{\mathbf{i} \in \{0,1\}^n} \bigl( \mathbf{G}(\mathbf{X} + \mathbf{i}) \cdot (\mathbf{p} - \mathbf{X} - \mathbf{i}) \bigr) \prod_{d=1}^n w_d(i_d) where w_d(0) = 1 - f(p_d - X_d), w_d(1) = f(p_d - X_d), \mathbf{G} is the pseudo-random gradient at each corner, \cdot denotes the , and f(t) = 3t^2 - 2t^3 is the fade function (a later improvement uses a quintic f(t) = 6t^5 - 15t^4 + 10t^3). This summation ensures locality and smoothness but scales poorly. A key limitation of classic is its exponential in higher dimensions, requiring evaluation of all $2^n vertices per sample, which becomes prohibitive for n > 3 and limits its use in applications like spacetime animations. The cubic structure also introduces artifacts, such as correlated directions and visible grid alignments, particularly evident in elevated dimensions where the regular spacing disrupts . For pioneering procedural texturing techniques, including , that enhanced visual effects in films like (1982), Perlin received the Academy of Motion Picture Arts and Sciences' Technical Achievement Award in 1997.

Value noise

is a foundational type of procedural noise that assigns pseudo-random scalar values, typically between -1 and 1, to the integer points of a regular in one or more dimensions. These values are then interpolated to compute noise at arbitrary positions, producing smooth but unstructured variations suitable for basic . The core process begins with seeding a pseudo-random number generator to populate lattice points—such as (0,0), (1,0), (0,1), and (1,1) in 2D—with independent random scalars. For a query point within a unit cell defined by these points, the noise value is obtained via interpolation; common methods include linear interpolation (bilinear in 2D or trilinear in 3D) for simplicity or higher-order spline interpolation for smoother transitions and reduced discontinuities in derivatives. This approach inherently lacks directional bias, yielding isotropic patterns without the flowing continuity seen in more advanced techniques. Value noise offers advantages in computational efficiency and low memory requirements, as it avoids complex vector operations and enables fast, randomly accessible evaluations with continuous multi-resolution output. However, its reliance on lattice-aligned randomness often results in visible grid artifacts and blocky appearances, producing less organic outcomes than gradient-based methods and potentially leading to or detail loss without careful filtering. Variants enhance its flexibility; for instance, random displacement value noise perturbs lattice point positions slightly before interpolation to mitigate grid visibility, while layered value noise combines multiple scaled and weighted instances across octaves to generate fractal-like complexity akin to . Historically, value noise emerged as an early lattice-based approach in for procedural texturing, predating gradient noise innovations and finding use in initial and generation efforts during the 1980s and 1990s, though it has since been largely supplanted by higher-quality alternatives for demanding visual applications.

Mathematical foundations

Simplex geometry

A is a fundamental geometric object in n-dimensional , defined as the of n+1 affinely independent points, representing the simplest that spans the space. This structure generalizes familiar shapes: in one dimension, it is a joining two points; in two dimensions, an with three vertices; and in three dimensions, a with four vertices. Higher-dimensional simplices, such as the 4D pentachoron with five vertices, maintain this linear growth in the number of vertices (n+1), in contrast to the (2^n vertices) observed in hypercubes, which facilitates efficient computational traversal and subdivision in algorithms operating on these lattices. Key properties of simplices include their compact vertex count, enabling space-filling without , and their potential for isotropic when arranged in a , meaning the structure appears uniform under rotation without directional biases. In the context of generation, simplices tile n-dimensional by partitioning each unit into exactly n! such simplices, creating a regular but skewed grid that avoids the cubic artifacts of traditional lattices; for instance, a divides into 6 tetrahedra, while a 4D requires 24. This introduces an inherent asymmetry in simplex orientations—skewed along the —to ensure even coverage and reduce visual distortions during evaluation. Mathematically, any point within an n-simplex can be uniquely represented using barycentric coordinates, which are non-negative weights \lambda_0, \lambda_1, \dots, \lambda_n summing to 1 such that the point p = \sum_{i=0}^n \lambda_i v_i, where v_i are the vertices; these coordinates parameterize the position relative to the boundaries. The volume V of the is given by V = \frac{1}{n!} \left| \det(M) \right|, where M is the n \times n whose columns are the vectors v_i - v_0 for i = 1 to n. In Simplex noise, this geometric framework provides the for placement, ensuring smooth across dimensions.

Gradient noise principles

Gradient noise is a procedural generation technique that produces smooth, continuous values by interpolating directional contributions from randomly assigned gradients at discrete lattice points. At its core, the noise value at a point \mathbf{x} is computed as the sum of dot products between predefined random gradient vectors \mathbf{G}_i at nearby lattice points \mathbf{p}_i and the displacement vectors \mathbf{x} - \mathbf{p}_i from those points, each weighted by an attenuation kernel function k(d_i) based on the distance d_i. This approach ensures that the resulting noise field exhibits statistical uniformity and band-limited frequency characteristics, making it suitable for applications requiring organic, flowing patterns such as terrain generation or texture synthesis. Unlike , which interpolates random scalar values at points and often results in blocky or discontinuous artifacts, leverages directional to create more coherent and visually appealing interpolations. The directional nature of the gradients introduces a of and continuity, mimicking natural phenomena like or currents, as the noise values smoothly transition based on the alignment of the with the local gradient direction. This advantage stems from the mathematical formulation that inherently ties the to vector fields, reducing perceptual artifacts like grid alignment visibility. Key elements of gradient noise include unit-length random gradient vectors \mathbf{G}_i, typically selected pseudo-randomly from a set of directions to ensure isotropy and avoid bias, and fade kernels such as quintic polynomials for higher-order smoothness. The general form of the noise function can be expressed as: \text{noise}(\mathbf{x}) = \sum_i \left[ \mathbf{G}_i \cdot (\mathbf{x} - \mathbf{p}_i) \cdot k(d_i) \right] where the sum is over relevant lattice points i, and the kernel k (e.g., k(t) = 6t^5 - 15t^4 + 10t^3 for quintic interpolation) ensures seamless blending. With an appropriate kernel choice, such as one with vanishing first and second derivatives at the boundaries, the noise achieves C^1 or higher continuity, allowing for smooth analytical derivatives that are valuable in simulations like particle flow fields or normal mapping in graphics.

Algorithm description

Coordinate skewing

Coordinate skewing is the initial step in the Simplex noise algorithm, where the input coordinates are transformed via an asymmetric linear mapping to align the simplicial grid with the of the computational space. This simplifies the process of identifying the containing for any given point and determining its relative position within that , enabling efficient traversal and evaluation without the need for complex simplex enumeration. By skewing along the of the space, the algorithm ensures that each point maps uniquely to a single , avoiding overlaps and facilitating consistent orientation across . In two dimensions, the skewing uses a factor F_2 = \frac{\sqrt{3} - 1}{2} \approx 0.366, derived from the of equilateral triangles to achieve . The skewed coordinates (x', y') are computed as follows: first, calculate the sum skew s = (x + y) \cdot F_2, then x' = x + s and y' = y + s. This stretches the space such that the simplices align with the axes after transformation, making it straightforward to locate the containing the point. For general n-dimensional cases, the skewing employs a factor F_n = \frac{1}{n} adjusted by the simplex geometry, typically implemented as a onto the followed by scaling. The sum of coordinates is divided by n and added equally to each , ensuring the transformation maps the irregular simplex onto a regular hypercubic grid. This approach guarantees a unique simplex association for every input point, with the skew implicitly defined by these constants to maintain uniformity across dimensions. To identify the simplex vertices, the coordinates are obtained by taking the of the skewed values: i = \lfloor x' \rfloor, j = \lfloor y' \rfloor (and similarly for higher dimensions). These define the in skewed space, from which the is selected by permutation indices based on coordinate magnitudes. Unskewing then recovers the original-space vertices using the factor G_2 = \frac{3 - \sqrt{3}}{6} \approx 0.211 for , where the unskew t = (i + j) \cdot G_2, and vertex offsets are X_0 = i - t, Y_0 = j - t; the relative position within the simplex is x_0 = x - X_0, y_0 = y - Y_0. This step leads directly into simplicial subdivision for identification. By consistently orienting simplices through this skewing, the algorithm reduces cubic bias inherent in lattice-based methods like classic , where uneven cell shapes lead to directional artifacts and non-isotropic patterns. The asymmetric transformation ensures equitable distribution of simplex orientations, promoting smoother, more uniform without the clustered gradients or visible seams that plague cubic grids.

Simplicial subdivision

In the Simplex noise algorithm, simplicial subdivision occurs after coordinate skewing and involves identifying the n+1 lattice points that form the vertices of the simplex containing the input point in the skewed space. This step decomposes the surrounding into one of its n+1 possible by determining the appropriate directional offsets based on the point's position within the . The choice of ensures complete coverage of the space without overlaps or gaps, as the tile the n-dimensional domain. The process relies on the integer parts of the skewed coordinates to locate the origin and uses the fractional parts to select the specific orientation. The n+1 vertices are generated starting from the base integer lattice point derived from the skewed coordinates. For each vertex, an offset vector is computed, consisting of 0 or 1 along selected dimensions, accumulating along a sequence of axes to form the simplex edges. These offsets are determined by comparing the magnitudes of the fractional parts in the skewed space, which identifies the simplex by finding the region where the point lies (e.g., in 2D, comparing the x and y fractional parts to choose between two possible triangles). To ensure pseudo-randomness and isotropy, a permutation table hashes the integer coordinates of each vertex to later assign unique properties, though the positions themselves are fixed by the geometry. The actual vertex positions for interpolation are then obtained by unskewing these relative offsets back to the original coordinate space using the inverse transformation factor G_n = \frac{1}{n+1}. For a relative skewed offset \mathbf{o} at vertex k, the unskewed relative position \mathbf{v}_k is calculated as \mathbf{v}_k = \mathbf{f} - \mathbf{o} + k \cdot G_n \cdot \mathbf{1}, where \mathbf{f} is the fractional part vector in skewed space and \mathbf{1} is the all-ones vector adjusted per dimension. This unskewing aligns the contributions correctly in the original space. In higher dimensions, the permutation table plays a key role in generalizing the offset selection by providing a hashed ordering of the dimensions, effectively randomizing the simplex orientation for each while maintaining the structural decomposition. Up to n additional potential simplex configurations are implicitly considered through the comparisons, but only the one containing the point is selected for evaluation, ensuring efficient coverage without evaluating unnecessary regions. This contrasts with hypercube-based methods, as the simplicial structure avoids redundant computations across shared boundaries. A key advantage of this subdivision is its computational efficiency: it requires contributions from only vertices in n dimensions, scaling linearly with dimensionality, whereas classic evaluates all 2^n corners of the . For example, in , Simplex noise uses 4 vertices compared to 8 for , reducing the number of operations significantly for higher dimensions like (5 vs. 16). The following illustrates the computation for relative displacements in (n=2), where the is used post-positioning for hashing, but the offsets generate the three vertices based on fractional comparison:
double F2 = 0.5 * (sqrt(3) - 1);  // Skew factor
double G2 = (3 - sqrt(3)) / 6;    // Unskew factor

// Assume skewed coordinates xs, ys; base integers i, j from floor(xs), floor(ys)
double x_calc = xs - i;
double y_calc = ys - j;

// Relative displacements for vertices (equivalent in original space)
double vx0 = x_calc, vy0 = y_calc;  // For vertex 0

if (x_calc > y_calc) {
    i1 = 1; j1 = 0;  // Vertex 1 offset: (1,0)
} else {
    i1 = 0; j1 = 1;  // Vertex 1 offset: (0,1)
}
double vx1 = x_calc - i1 + G2;
double vy1 = y_calc - j1 + G2;

// Vertex 2 offset: (1,1)
double vx2 = x_calc - 1.0 + G2 * 2;
double vy2 = y_calc - 1.0 + G2 * 2;

// Now, for each vertex k=0 to 2, use vxk, vyk for dot products
// Hash for later use: e.g., for vertex 0: perm[i + perm[j]] % 12
// Similar for vertex 1: perm[(i+i1) + perm[(j+j1)]] % 12
// Vertex 2: perm[(i+1) + perm[(j+1)]] % 12
This pattern extends to higher dimensions with more conditional branches or generalized for offset selection.

Gradient selection

In Simplex noise, gradient selection involves assigning a pseudo-random unit to each of the identified , ensuring the noise function exhibits desirable statistical such as uniformity and lack of directional . This process relies on a precomputed table to generate deterministic yet unpredictable directions based on the integer coordinates of the . The table, typically a 512-entry derived by duplicating a 256-entry base , facilitates efficient hashing of multi-dimensional coordinates into indices for lookup. The hashing mechanism begins with the integer parts of the skewed input coordinates, denoted as i_x, i_y, i_z in three dimensions, which are masked to the range [0, 255] using bitwise AND operations (e.g., ii = i_x \& 255) to into the permutation table. A nested lookup computes a pseudo-random : for instance, in , the is obtained as \text{perm}[ii + \text{perm}[jj + \text{perm}[kk]]], where jj = i_y \& 255 and kk = i_z \& 255. This value is then modulo-reduced by the number of available gradients (e.g., 12 for ) to select a specific from a precomputed table. The gradient table consists of a fixed set of unit-length vectors, carefully chosen to provide isotropic contributions without favoring any direction. In and , there are 12 such vectors, typically including directions like \{1, 1, 0\}, \{-1, 1, 0\}, and their permutations and sign variants, each normalized to length 1 to ensure consistent magnitude across the field. For , the table expands to 32 vectors to accommodate the increased simplex complexity, maintaining unit . These vectors are selected as midpoints of the edges of a , promoting even distribution and avoiding the computational overhead of on-the-fly . This approach ensures statistical uniformity in gradient directions, as the permutation table is designed to produce a balanced, of indices, mimicking true while remaining fully deterministic. The fixed permutation, often seeded with a standard initialization for across implementations, allows consistent generation for the same input coordinates, which is essential for applications requiring repeatable procedural content. In higher dimensions, the table size and number of gradients scale with dimensionality—using d+1 vertices per and an appropriate number of candidate directions—to preserve these properties without in complexity. For a 3D vertex at integers (i_x, i_y, i_z), the selected gradient G is thus given by: G = \nabla_{\text{grad}} \left[ \text{perm}[i_x + \text{perm}[i_y + \text{perm}[i_z]]] \mod 12 \right] where \nabla_{\text{grad}} indexes the gradient table. This formulation, adapted from classic noise principles, integrates seamlessly into the framework for efficient, high-quality evaluation.

Kernel summation

In Simplex noise, the kernel summation step computes the final noise value by aggregating contributions from the gradients at the vertices of the simplex containing the input point. Each contribution is determined by the dot product between a randomly selected gradient vector at a simplex vertex and the relative displacement vector from that vertex to the input point, weighted by a radial fade factor to ensure smooth interpolation and C^1 continuity at boundaries. This process integrates the gradient influences across the simplex vertices, producing a continuous noise field without the lattice artifacts common in hypercube-based methods. For each simplex vertex k, the local coordinates \Delta \mathbf{x}_k are the vector differences between the input point and the vertex position. A gradient vector \mathbf{G}_k is selected pseudorandomly for that vertex, typically from a fixed set of unit vectors oriented along simplex edges. The raw contribution is the dot product \mathbf{G}_k \cdot \Delta \mathbf{x}_k, which measures the projected influence of the gradient on the displacement. This dot product is then modulated by a fade weight derived from the squared Euclidean distance r_k^2 = \sum_i (\Delta x_{k,i})^2 to the vertex, using a radial kernel: let t_k = 0.5 - r_k^2; if t_k > 0, the weight is t_k^4, otherwise the contribution is 0. This ensures the influence diminishes smoothly and isotropically as the point moves away from the vertex, with weights summing appropriately across the simplex for seamless blending. The total noise value is obtained by summing these weighted contributions over the n+1 vertices in an n-dimensional (e.g., 3 vertices in 2D, 4 in 3D), followed by scaling with a dimension-specific normalization factor to constrain the output to the range [-1, 1]: n(\mathbf{x}) = F \sum_{k=0}^{n} w_k \cdot (\mathbf{G}_k \cdot \Delta \mathbf{x}_k), where w_k = t_k^4 if t_k > 0 else 0. The factor F compensates for the varying number of contributions and the kernel's properties; for example, F = 70 in 2D and F = 32 in 3D, ensuring consistent amplitude across dimensions. This summation is performed only over the single simplex containing the input point, keeping the computation local and efficient. The resulting output is a scalar value representing the noise intensity at the input point. For vector-valued , such as in , multiple independent scalar evaluations are performed (e.g., along perpendicular directions) and combined, often via basis transformation, to yield multidimensional results while preserving .

Properties and performance

Continuity and quality

Simplex noise achieves C¹ differentiability across its domain due to the use of a quintic , which provides a continuous first and eliminates visible seams or discontinuities in the output. This arises from the careful design of the interpolation , a fifth-degree polynomial that ensures the noise and its gradient are well-defined everywhere, facilitating applications requiring computations such as in . The noise exhibits strong , characterized by a uniform spectral distribution that remains consistent across all directions, thereby reducing the directional biases inherent in classic Perlin noise's cubic lattice structure. Unlike hypercube-based methods, the simplex grid underlying the algorithm contributes to this balanced energy distribution, enhancing the perceptual uniformity of generated textures. In terms of quality metrics, Simplex noise emphasizes low-frequency components, concentrating energy in a compact to produce natural, organic patterns suitable for simulating phenomena like or clouds. Visual inspections of and renders demonstrate smooth, flowing gradients without prominent grid lines or foveation artifacts, yielding coherent pseudo-random fields that appear more isotropic and artifact-free than predecessors. These attributes stem directly from the spherically symmetric and gradient-based evaluation, ensuring high-fidelity results in tasks. While robust in lower dimensions, Simplex noise maintains its continuity properties effectively up to high dimensions (e.g., 10D), where the structure prevents the exponential increase in artifacts seen in lattice-based noises, though implementation tuning is advised for optimal in extreme cases.

Computational efficiency

Simplex noise exhibits a of O(n²) for evaluation in n dimensions, primarily due to the fixed number of per evaluation, in contrast to the exponential O(n \cdot 2^n) complexity of classic , which requires evaluating at all corners of a . This scaling arises because simplex noise processes only n+1 vertices per , involving n+1 dot products and fade computations, rather than the 2^n vertices needed in . lookups for selection are performed in constant time using precomputed tables, minimizing variable-time operations. In practice, these factors contribute to superior performance, particularly in three dimensions, where simplex noise requires half the evaluations (four versus eight) compared to , resulting in approximately twice the speed. This efficiency extends quadratically to higher dimensions without ; for instance, in ten dimensions, simplex noise demands on the order of 100 operations, while Perlin noise requires over 10,000, yielding a 100-fold advantage. The algorithm's design further enhances scalability by avoiding multiplications entirely in computations through and integer arithmetic for hashing, reducing both computational cost and hardware gate requirements to under 10,000 gates for a pipelined implementation. Optimizations such as these make simplex noise particularly suitable for GPU acceleration, owing to its low branching and reliance on parallelizable dot products and additions. However, the coordinate skewing and unskewing steps introduce slightly higher constant factors due to additional arithmetic, though these are outweighed by the overall reduction in operations for dimensions greater than two, making simplex noise preferable for multidimensional applications.

Implementations and variants

Reference implementation

The reference implementation of Simplex noise is a Java-based originally developed by Ken Perlin around , which forms the basis for subsequent variants. This implementation supports evaluation in , , and , producing output values normalized to the range [-1, 1], which can be linearly mapped to [0, 1] by adding 1 and dividing by 2. It employs fixed sets of normalized gradient vectors for efficiency, such as 8 vectors in and 12 in , selected via a permutation-based to ensure pseudo-random orientation. A key component is the permutation array, consisting of a 256-entry table of shuffled integers (0 through 255) duplicated to length 512 to avoid during lookups. The array is precomputed once at initialization for performance, with shuffling typically achieved by swapping elements based on a or fixed to generate repeatable . Floating-point precision is handled carefully during unskewing steps to prevent artifacts from rounding errors in coordinate transformations. The original implementation was protected under U.S. Patent 6,867,776, filed in 2001 and issued on March 15, 2005, which restricted commercial use until its expiration on January 8, 2022, after which it entered the public domain. For 2D evaluation, the following pseudocode illustrates the core logic, including permutation initialization (using Perlin's standard fixed permutation values for reproducibility):
java
// Permutation table initialization (256 values, duplicated to 512)
private static final int[] p = {
    151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,
    8,99,37,240,21,10,23,190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,
    35,11,32,57,177,33,88,237,149,56,87,174,20,125,136,171,168,68,175,74,165,71,
    134,139,48,27,166,77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,
    55,46,245,40,244,102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208,89,
    18,169,200,196,135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,
    250,124,123,5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,
    182,189,28,42,223,183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,
    167,43,172,9,129,22,39,253,19,98,108,110,79,113,224,232,178,185,112,104,
    218,246,97,228,251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,
    249,14,239,107,49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,
    127,4,150,254,138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,
    215,61,156,180
};
private static int[] perm = new int[512];
static {
    for (int i = 0; i < 512; i++) {
        perm[i] = p[i & 255];
    }
}

// 2D gradient vectors (8 total, but %12 indexing for compatibility)
private static final double[][] grad2 = {
    {1,1}, {-1,1}, {1,-1}, {-1,-1},
    {1,0}, {-1,0}, {0,1}, {0,-1}
};

// 2D noise evaluation
public static double noise(double x, double y) {
    double F2 = 0.5 * (Math.sqrt(3.0) - 1.0);
    double s = (x + y) * F2;
    int i = (int) Math.floor(x + s);
    int j = (int) Math.floor(y + s);
    double G2 = (3.0 - Math.sqrt(3.0)) / 6.0;
    double t = (i + j) * G2;
    double X0 = i - t;
    double Y0 = j - t;
    double x0 = x - X0;
    double y0 = y - Y0;
    int i1, j1;
    if (x0 > y0) {
        i1 = 1; j1 = 0;
    } else {
        i1 = 0; j1 = 1;
    }
    double x1 = x0 - i1 + G2;
    double y1 = y0 - j1 + G2;
    double x2 = x0 - 1.0 + 2.0 * G2;
    double y2 = y0 - 1.0 + 2.0 * G2;
    int ii = i & 255;
    int jj = j & 255;
    int gi0 = perm[ii + perm[jj]] % 12 % 8;  // Map to 8 gradients
    int gi1 = perm[ii + i1 + perm[jj + j1]] % 12 % 8;
    int gi2 = perm[ii + 1 + perm[jj + 1]] % 12 % 8;
    double t0 = 0.5 - x0 * x0 - y0 * y0;
    double n0 = t0 < 0 ? 0 : t0 * t0 * t0 * t0 * dot(grad2[gi0], x0, y0);
    double t1 = 0.5 - x1 * x1 - y1 * y1;
    double n1 = t1 < 0 ? 0 : t1 * t1 * t1 * t1 * dot(grad2[gi1], x1, y1);
    double t2 = 0.5 - x2 * x2 - y2 * y2;
    double n2 = t2 < 0 ? 0 : t2 * t2 * t2 * t2 * dot(grad2[gi2], x2, y2);
    return 70.0 * (n0 + n1 + n2);  // Scale to approximate [-1, 1]
}

private static double dot(double[] g, double x, double y) {
    return g[0] * x + g[1] * y;
}
This pseudocode demonstrates the skewing, simplicial grid traversal, products, and quintic interpolation kernel summation central to the algorithm.

OpenSimplex noise

is a algorithm developed by Kurt Spencer in 2014 as an open-source, patent-free alternative to Simplex noise. It was designed to avoid infringement on U.S. Patent 6,867,776 by employing distinct hashing mechanisms and skewing techniques that diverge from the patented Simplex method while preserving similar capabilities. The algorithm supports n-dimensional noise up to 4D, making it suitable for applications requiring isotropic patterns without legal restrictions. Key differences from Simplex noise include symmetric skewing factors, such as a skew of approximately 0.366, which promote balanced distortion, along with alternative orientations like rotated grids for improved spatial uniformity. Additionally, OpenSimplex utilizes expanded sets—such as 128 directions in compared to fewer in the original Simplex—to enhance and reduce directional biases in generated patterns. These modifications result in smoother outputs at the expense of slightly larger sizes. In 2018, Spencer released OpenSimplex2, an improved variant that refines and quality through updated selections and configurations, while maintaining efficient support up to and optional extensions to higher dimensions. OpenSimplex2 includes sub-variants like OpenSimplex2F for faster, Simplex-like performance and OpenSimplex2S for smoother, more uniform results. Prior to the expiration of the Simplex noise patent in January 2022, OpenSimplex saw widespread adoption in game development, including plugins and various libraries, due to its unrestricted licensing. With the patent now lapsed, many projects are transitioning back to the original Simplex implementations, though OpenSimplex remains popular for its tailored . Performance-wise, OpenSimplex is comparable to Simplex noise in computational efficiency, often matching or slightly exceeding it in and while incurring minor quality trade-offs, such as reduced contrast, in higher dimensions.

Applications

Procedural content generation

Simplex noise plays a central role in procedural terrain generation within and simulations, where it is often layered using fractal Brownian motion (fBm) to create heightmaps that mimic landscapes. This technique involves summing multiple octaves of noise at progressively higher frequencies and lower amplitudes, such as combining a base layer for broad continental shapes with subsequent layers for finer details like hills and valleys, resulting in cohesive and scalable . For instance, developers apply fBm with 4–8 octaves to generate varied elevations, normalizing the output to ensure balanced distribution across the map. In game examples, Simplex noise enables Minecraft-like worlds through mods that replace default generators, producing full-height-range terrains with diverse biomes, caves, and surface features for immersive exploration. Similarly, it supports side-view procedural maps in 2D games reminiscent of , where 2D Simplex noise defines destructible landscapes with smooth contours and varied elevations. These applications highlight Simplex noise's efficiency in handling large-scale worlds without excessive computational overhead. For texturing, Simplex noise drives to add realistic surface irregularities, deforming meshes based on noise values to simulate organic forms like rocky outcrops or uneven ground. By employing octaves, it captures multi-scale details—coarse layers for major formations such as mountains, overlaid with subtle ones for effects like cracks and —enhancing visual depth in real-time rendering. This approach is particularly valued for its seamless blending with and materials. Animation benefits from treating time as a fourth input to Simplex noise, producing fluid evolutions such as drifting formations or dynamic effects that maintain across . Layered noise here adds complexity, with lower frequencies controlling overall motion and higher ones introducing for lifelike variability. the noise generator ensures reproducible animations and terrains, allowing identical outputs from the same input for consistent or rendering sessions. Vector variants of Simplex noise, including curl noise computed from its gradients, create divergence-free flow fields ideal for simulations such as particle systems with natural, swirling trajectories. Simplex noise leverages its inherent smoothness for natural results in these creative applications. In case studies from , Simplex noise has advanced film production since Ken Perlin's 1997 Academy Award for procedural textures, appearing in tools like Houdini's xnoise VEX function for generating organic displacements and animations in movies. Houdini nodes employing Simplex noise facilitate VFX workflows, such as terrain deformation and fluid effects in high-profile films, offering artifact-free gradients for professional rendering pipelines.

Scientific and engineering uses

In physics simulations, Simplex noise is employed to model in by generating divergence-free velocity fields through techniques like curl noise, where it provides smooth, artifact-reduced perturbations for particle in systems. For instance, in experimental setups for emulating grid , 4D controls jet firing sequences to produce controlled, reproducible turbulent flows in water injection systems. This approach leverages Simplex noise's continuous gradients to simulate realistic random fields for particle distributions, ensuring organic variability without directional biases in high-dimensional spaces. In applications, Simplex noise facilitates by generating randomized structural loads and perturbed geometries for simulations. Researchers have used it to create correlated porous crystalline silica structures, enabling molecular dynamics assessments of yield under tensile and shear deformations, which reveal relationships between local coordination and global properties. Additionally, in materials , Simplex noise constructs multi-scale virtual aggregates for mixtures, allowing finite element modeling of realistic particle distributions to predict responses and failure modes in pavements. In and simulations, Simplex noise introduces randomness to model processes and cellular automata, producing textured surfaces that mimic natural irregularities for frictional and reactive studies. It has been applied to generate synthetic topographies labeled with frictional properties via -based predictions, aiding in the simulation of molecular interactions on irregular interfaces. Simplex noise enhances in by adding structured perturbations to datasets, improving model robustness in image synthesis and classification tasks. In medical imaging, 2D Perlin simplex noise variants augment small high-resolution computed tomography samples, boosting accuracy for pixel-level quantification of diffuse lung diseases by simulating natural textural variations. This method outperforms traditional augmentations in low-data regimes, as the noise's smooth gradients preserve semantic features while introducing diversity, particularly for robustness against synthesis artifacts in generative models. In finite element analysis, perturbed boundaries generated by Simplex noise enable accurate simulations of irregular geometries, such as in aggregate-based materials, to evaluate stress concentrations and deformation under load.

References

  1. [1]
    Improving noise | ACM Transactions on Graphics - ACM Digital Library
    Two deficiencies in the original Noise algorithm are corrected: second order interpolation discontinuity and unoptimal gradient computation.
  2. [2]
    [PDF] Simplex noise demystified - CGVR
    Mar 22, 2005 · In 2001, Ken Perlin presented “simplex noise”, a replacement for his classic noise algorithm. Classic “Perlin noise” won him an academy award ...
  3. [3]
    A sheet of simplex noise
    As the noise flows upward through the sheet, like a kind of magic wind pressure, the bumps on the sheet rise and fall with the noise value. - Ken Perlin. † O ...
  4. [4]
    [PDF] Chapter 2: Noise Hardware - UMBC CSEE
    Perlin Noise has been a mainstay of computer graphics since 1985. [EBERT98],[FOLEY96],[PERLIN85], being the core procedure that enables procedural shaders ...
  5. [5]
    US6867776B2 - Standard for perlin noise - Google Patents
    The present invention is related to noise where images have texture but do not have visible grid artifacts and/or are visually isotropic.
  6. [6]
    Perlin noise reference implementation - NYU Computer Science
    This code implements the algorithm I describe in a corresponding SIGGRAPH 2002 paper. // JAVA REFERENCE IMPLEMENTATION OF IMPROVED NOISE - COPYRIGHT 2002 ...Missing: simplex | Show results with:simplex
  7. [7]
    Like Simplex Noise but don't like the patent? Introducing ...
    Sep 22, 2014 · There's Perlin Noise, which has grid artificts, and there's Simplex Noise, which is patented (for 3D+ implementations), so here's something new!Missing: avoid | Show results with:avoid
  8. [8]
    image processing - Simplex noise vs Perlin noise - Stack Overflow
    Jun 22, 2011 · Simplex noise was made by Ken Perlin himself and it was suppose to take over his old algorithm which was slow for higher dimensions and with ...Why does simplex noise seem to have *more* artifacts than classic ...Perlin noise algorithm - Stack OverflowMore results from stackoverflow.com
  9. [9]
    An image synthesizer | ACM SIGGRAPH Computer Graphics
    An image synthesizer. Author: Ken Perlin. Ken Perlin. Courant Institute of ... PDFeReader. Contents. ACM SIGGRAPH Computer Graphics. Volume 19, Issue 3 ...
  10. [10]
  11. [11]
    Ken's Academy Award - NYU Computer Science
    To Ken Perlin for the development of Perlin Noise, a technique used to produce natural appearing textures on computer generated surfaces for motion picture ...
  12. [12]
    Noise - Physically Based Rendering: From Theory to Implementation
    A simple example of this approach is value noise, where pseudo-random numbers between ... lattice points. The derivatives are used to compute a smooth ...
  13. [13]
    [PDF] A Survey of Procedural Noise Functions - UMD CS
    We discuss how procedural noise functions are used for modeling and how they are applied to surfaces. We then introduce analysis tools and apply them to ...
  14. [14]
    Simplex -- from Wolfram MathWorld
    A simplex, sometimes called a hypertetrahedron (Buekenhout and Parker 1998), is the generalization of a tetrahedral region of space to n dimensions.
  15. [15]
    [PDF] Improving Noise - NYU Media Research Lab
    Improving Noise. Ken Perlin. Media Research Laboratory, Dept. of Computer Science, New York University perlin@cat.nyu.edu. ABSTRACT. Two deficiencies in the ...Missing: simplex | Show results with:simplex
  16. [16]
    [PDF] An image synthesizer - DOU
    An Image Synthesizer. Ken Perlin. Courant Institute of Mathematical Sciences. New York University. Abstract. We introduce the concept of a Pixel Stream Editor ...
  17. [17]
    [PDF] Simplex noise demystified - ITN
    Mar 22, 2005 · In 2001, Ken Perlin presented “simplex noise”, a replacement for his classic noise algorithm. Classic “Perlin noise” won him an academy award ...Missing: invention | Show results with:invention
  18. [18]
    (PDF) Simplex noise demystified - ResearchGate
    PDF | "Simplex Noise", a creation by Ken Perlin from 2001 that addresses some of the shortcomings of his monster hit classic "Perlin noise", has an.
  19. [19]
    KdotJPG/OpenSimplex2: Successors to OpenSimplex Noise, plus ...
    OpenSimplex2S and Updated OpenSimplex are effectively identical. Original OpenSimplex produced more straight parts and was not as probabilistically symmetric.
  20. [20]
    Visually isotropic coherent noise algorithm based on ... - GitHub Gist
    OpenSimplex noise uses a larger kernel size than Simplex noise, which results in slightly lost performance.
  21. [21]
    Making maps with noise functions - Red Blob Games
    Jul 7, 2015 · Interactive tutorial for using Simplex/Perlin noise to make terrain and biomes for a wilderness map.
  22. [22]
    Continents with Simplex noise - Game Development Stack Exchange
    Oct 20, 2019 · It directly shows how to use simplex noise, as well as noise-derived effects like octaves and differences, to build out a world in layers.Using Perlin/Simplex noise in a 2d tile game for terrain generationGenerating island terrains with Simplex Noise (C#/XNA)More results from gamedev.stackexchange.com
  23. [23]
    Fractal Brownian Motion - The Book of Shaders
    It's essentially an fBm, but constructed from the absolute value of a signed noise to create sharp valleys in the function.
  24. [24]
    Simplex Terrain Generation - Minecraft Mods - CurseForge
    Simplex Terrain Generation is an alternative worldgen mod that creates breathtaking world generation that takes up the entire height.
  25. [25]
    Generating Worms-style Terrain with Simplex Noise
    Jul 26, 2023 · This article will show you how to procedurally generate Worms-like 2D side view game maps from a blank slate, requiring only basic programming knowledge.
  26. [26]
    Working with Simplex Noise
    Simplex noise is a complicated beast. It's a straight-up math algorithm involving simplices and is designed to be implemented in hardware.
  27. [27]
    Perlin Noise: Implementation, Procedural Generation, and Simplex ...
    The dot product is especially central to Perlin Noise, determining the contribution of each gradient direction to the final noise value. The magic of Perlin ...Missing: formula | Show results with:formula
  28. [28]
    Random seed for Simplex noise - python - Stack Overflow
    Dec 3, 2016 · I'm procedurally generating terrain for games. I gave Simplex noise a shot. The terrain is generated beautifully. However, when I run the ...<|separator|>
  29. [29]
    Simplex Curl Noise for Real-Time Particle Systems - TOTM
    Jan 11, 2014 · Crucially for curl noise, the gradients can be computed directly in about the same time it takes to calculate the noise values. Finite ...Missing: procedural | Show results with:procedural
  30. [30]
    xnoise VEX function - SideFX
    Simplex noise is very close to Perlin noise, except with the samples on a simplex mesh rather than a grid. This results in less grid artifacts.
  31. [31]
    [PDF] Pseudorandom Noise for Real-Time Volumetric Rendering of Fire in ...
    Simplex noise has a higher peak range than the other noise types but it is possible to generate a Sim- plex noise-based turbulence resembling a Perlin noise- ...
  32. [32]
    TWISTER (Twente water injection system for turbulence ...
    Sep 14, 2025 · To control the firing sequence of the jets, we developed a novel type of operating protocol based on 4D Open Simplex noise. We are able to tune ...
  33. [33]
    Modeling the relationship between mechanical yield stress and ...
    Sep 11, 2023 · Here, we apply it to a 3D mechanical system and sample geometries generated by simplex noise21 to obtain structures with extended correlations.
  34. [34]
    Multi-scale algorithm for controllable virtual aggregate generation in ...
    Nov 1, 2025 · The algorithm utilizes ellipsoidal primitives, α-shape, and Perlin or Simplex noise to construct realistic multi-scale aggregate features. •.
  35. [35]
    [PDF] Exploring Musical Trajectories in Simplex Noise Space
    Sep 7, 2025 · Spectrograms showing different parameter combinations of simplex noise output. Rows show increasing vertical movement speeds. (0-1000 units/s) ...
  36. [36]
    Tailoring Frictional Properties of Surfaces Using Diffusion Models
    Jan 5, 2024 · Our methodology includes training the DDPM on synthetic surfaces, designed using simplex noise and labeled with frictional properties determined ...
  37. [37]
    Tailoring Frictional Properties of Surfaces Using Diffusion Models
    Jul 31, 2025 · The surface topographies are created using Simplex noise, which is known for its capability to generate realistic surfaces. (13) We generate 128 ...
  38. [38]
    A Perlin Noise-Based Augmentation Strategy for Deep Learning with ...
    Dec 6, 2018 · In this study, we present a general data augmentation strategy using Perlin noise, applying it to pixel-by-pixel image classification and quantification.
  39. [39]
    (PDF) A Perlin Noise-Based Augmentation Strategy for Deep ...
    In this study, we present a general data augmentation strategy using Perlin noise, applying it to pixel-by-pixel image classification and quantification of ...
  40. [40]
    Procedural terrain generation with style transfer - arXiv
    In this study we introduce a new technique for the generation of terrain maps, exploiting a combination of procedural generation and Neural Style Transfer.