Fact-checked by Grok 2 weeks ago

OpenSimplex noise

OpenSimplex noise is an n-dimensional gradient noise function (supporting up to 4 dimensions) developed by Kurt Spencer in September 2014 as a patent-free alternative to , addressing the licensing restrictions on higher-dimensional implementations of the latter at the time (the Simplex noise patent expired in 2022). It generates smooth, high-quality pseudorandom patterns suitable for procedural content creation, with reduced visible repetition and artifacts compared to , though it requires approximately twice the computation time and produces features roughly double the size at slightly lower contrast compared to . The algorithm builds on the principles of gradient noise, where values are interpolated from random gradients at lattice points, but employs a larger kernel and optimized lattice orientations to enhance isotropy and visual quality, particularly in 3D and 4D spaces. Released into the public domain, OpenSimplex noise has been widely ported to languages including Python, Go, Rust, and JavaScript, and integrated into tools like the Godot game engine (via FastNoiseLite supporting OpenSimplex variants as of Godot 4) for terrain generation, animations, and texture synthesis. Its output typically ranges from about 0.06 to 0.93 across dimensions (based on 80,000 samples), making it versatile for applications requiring seamless, non-repeating noise.

Background

Gradient noise fundamentals

Gradient noise is a class of algorithms used to create smooth, natural-appearing randomness in and simulations, achieved by interpolating between random vectors assigned to points on a regular . Unlike simpler methods, it evaluates values at arbitrary points by computing contributions from nearby lattice points, where each contribution is derived from the of a pseudo-random vector at the lattice point and the from that point to the evaluation location, followed by attenuation based on distance. This approach ensures the generated is continuous and differentiable, making it suitable for modeling organic phenomena such as , clouds, or fluid motion in procedural textures. The foundations of gradient noise trace back to early work in , building on —a precursor that assigns random scalar values to lattice points and interpolates them linearly, often resulting in blocky or grid-aligned artifacts due to discontinuous derivatives. Gradient noise was pioneered by Ken Perlin in 1983, developed to address the unnatural, mechanical appearance of early during his work on for films. Perlin's implementation, detailed in his 1985 paper, introduced the core technique for efficient naturalistic using a pseudo-random to generate gradients at coordinates. This innovation earned Perlin a Technical Achievement Academy Award in 1997 for its widespread impact on in and rendering. Key components of gradient noise include the lattice structure, typically a uniform integer grid; pseudo-random gradient vectors, which are unit-length directions selected from a to ensure ; dot products that measure how aligned the evaluation direction is with the local ; and a smoothing kernel, often a cubic fade function like f(t) = 6t^5 - 15t^4 + 10t^3, to blend contributions smoothly and avoid sharp transitions. To generate 2D gradient noise at a point (x, y), the process conceptually follows these steps:
  1. Compute the lattice cell indices: i = \lfloor x \rfloor, j = \lfloor y \rfloor, and fractional offsets u = x - i, v = y - j.
  2. Identify the four surrounding corners: (i, j), (i+1, j), (i, j+1), (i+1, j+1).
  3. For each corner (x_k, y_k), retrieve or compute a pseudo-random gradient \mathbf{G}_k using a of the lattice coordinates.
  4. Calculate the distance \mathbf{D}_k = (x - x_k, y - y_k) and the raw influence as the \mathbf{G}_k \cdot \mathbf{D}_k.
  5. Apply fade curves to the offsets: fu = f(u), fv = f(v), and interpolate the influences bilinearly to yield the final value n = lerp(lerp(influence at bottom, influence at top, fv), lerp(influence at left, influence at right, fv), fu), scaled to [-1, 1].
This outline illustrates the lattice-based evaluation without delving into implementation details like tables. noise is preferred over for because it minimizes visible grid artifacts and produces more isotropic, organic patterns; often exhibits diagonal streaks or square blobs due to its reliance on scalar , whereas gradients enforce smoother variation aligned with local directions, enhancing realism in simulations. represents an advanced variant of that uses irregular simplices instead of hypercubes to reduce computational overhead in higher dimensions.

Simplex noise overview

Simplex noise, developed by Ken Perlin in 2001, serves as a refinement of his earlier classic algorithm from 1983. It replaces the hypercubic with a simplicial , which contains only n+1 points per cell in n dimensions rather than $2^n, resulting in substantially fewer evaluations and improved computational efficiency, especially as dimensionality increases. The underlying simplex grid employs simple geometric forms: line segments in 1D, equilateral triangles in 2D, regular tetrahedra in , and analogous hyper-simplices in higher dimensions. This design minimizes the number of adjacent cells to consider during evaluation, shifting the algorithmic complexity from exponential O(2^n) in classic to polynomial O(n^2), making it more suitable for real-time applications and dimensions beyond . At its core, the algorithm locates the simplex containing the input point by skewing and unskewing coordinates to identify the cell and its . Pseudo-random unit-length are then assigned to these using a , and the value is derived as a of contributions from each . Each contribution is the of the with the from the to the input point, attenuated by distance-based kernel functions for smooth blending. The interpolation within these contributions relies on a quintic fade curve, defined as F(t) = 6t^5 - 15t^4 + 10t^3, which ensures C^1 continuity and natural easing from 0 to 1. While effectively mitigates the directional artifacts present in classic —yielding visually isotropic output—and supports efficient higher-dimensional generation, its adoption was limited by U.S. 6,867,776 until expiration on January 8, 2022. In very high dimensions (e.g., 6D+), the coordinate sorting step for simplex identification introduces significant overhead, rendering it less practical.

Development

Motivation and patent context

The development of OpenSimplex noise arose from significant legal and practical barriers posed by the patent on Ken Perlin's Simplex noise algorithm. In 2001, Perlin filed for a patent on an improved noise generation method using simplicial grids to produce visually isotropic textures without grid artifacts, which was granted as US Patent 6,867,776 B2 in 2005 and restricted commercial implementations until its expiration in January 2022. This limitation hindered widespread adoption in open-source projects and commercial software, as developers risked infringement when integrating for tasks like modeling and . Within open-source communities focused on procedural , there was increasing demand for unrestricted alternatives to patented functions, particularly for tools in game engines, simulations, and where Simplex 's efficiency in higher dimensions was highly valued. Prior efforts to address this included adaptations of earlier types, such as Worley —a cellular introduced in that generates Voronoi-like patterns for organic textures—but these often fell short in delivering the continuous, gradient-based smoothness and spectral qualities of , making them less suitable for applications requiring seamless, artifact-free gradients. To overcome these patent-related constraints, software developer Kurt Spencer released OpenSimplex noise on September 22, 2014, explicitly designing it as an open, unlicensed gradient noise algorithm that supports up to four dimensions while aiming to match or exceed noise's quality without invoking protected methods. Spencer's implementation was created to ensure patent avoidance, providing a viable option for developers in resource-constrained environments like development and rendering.

Creation and release

OpenSimplex noise was developed by Kurt Spencer, a software developer interested in techniques for games. Spencer released the initial implementation on September 22, 2014, through a forum post on JVM Gaming, where he shared the source code for a noise generator as a patent-free alternative to . Spencer's development process focused on preserving 's core benefits, such as computational efficiency and fewer visible artifacts compared to classic , while avoiding patent restrictions and achieving better visual isotropy—particularly in higher dimensions—via modified lattice geometries and gradient selections. On October 5, 2014, he updated the code (version 1.1) to include and variants alongside the 3D implementation, with tweaks to the 3D gradient set for improved quality; these were also posted on the same forum, marking the first public demonstration of the algorithm's dimensional flexibility. The original code was released without a formal license, effectively placing it in the public domain to encourage broad adoption without legal barriers. This permissive approach, combined with the timing amid ongoing concerns over Simplex noise patents, led to quick community uptake; forum feedback highlighted its "really nice patterns" and technical merits, fostering integration into indie game tools and projects for tasks like terrain generation. By 2015, ports and adaptations began appearing in various languages, solidifying its role in open-source procedural workflows. In December 2019, Spencer released OpenSimplex 2, a revised version addressing limitations in higher dimensions and providing variants like OpenSimplex2S (sparse) and OpenSimplex2F (fast) for different optimization trade-offs.

Algorithm

Core generation process

The core generation process of OpenSimplex noise transforms an input point into a noise value through a series of geometric and arithmetic operations on a skewed . The input coordinates are first stretched by a factor derived from the , such as adding a stretch offset of (x + y) × -0.211324865405187 in , to align the point with the lattice cells. The negative stretch offset skews the lattice in the opposite direction to standard , dividing hypercubes into the non-patented pair of simplices while maintaining efficiency. The integer coordinates of the cell origin are then found by flooring these stretched values, and the point is squished back using a factor like 0.366025403784439 to determine its relative position within the cell. This skewing ensures an asymmetric distribution that avoids the patent-encumbered simplex shapes while maintaining efficient higher-dimensional scaling. The relative position identifies the contributing vertices within an expanded kernel around the cell, where gradients are evaluated. A key innovation is the larger, asymmetric kernel size compared to —for instance, 4 points in 2D versus Simplex's 3—which enables broader overlap for smoother and fewer visible artifacts like directional bias. Gradients for these vertices are assigned using a pseudo-random table, seeded to ensure ; the table indexes into a fixed set of unit-length vectors, akin to but adapted for the skewed . The displacement vector δ from the input point to each vertex is computed, and the raw contribution from a vertex is the of its and δ, often offset by a linear term (e.g., +1) to center the distribution around zero. Each contribution is weighted by a distance-based fade function to blend influences smoothly. The fade applies a quintic to the normalized distance t (where t ∈ [0,1] along the kernel ), given by
f(t) = 6t^5 - 15t^4 + 10t^3,
which provides a smoothstep-like with zero at the endpoints for artifact-free blending; the full weight for a is then att × f(t), where att = lin_grad + \mathbf{grad} \cdot \delta and t is derived from the within the . The total noise value is the sum of these weighted contributions across all vertices in the .
Finally, the summed value is normalized by dividing by a dimension-specific constant (e.g., 47 in 2D) to map the output to the range [-1, 1], ensuring consistent amplitude across evaluations. The hashes the provided to initialize and shuffle the table during , guaranteeing deterministic results for the same seed and input while varying patterns across different seeds.

Dimensional adaptations

OpenSimplex noise adapts its core algorithm to different dimensions through tailored lattice selections and skew parameters, ensuring reduced directional artifacts and improved compared to patented . These adaptations involve dimension-specific constants for stretching the input coordinates to align with the simplex and squishing them back for evaluation, while the choice of and size varies to balance visual quality and computational efficiency. The negative stretch ensures patent avoidance by using the alternate simplex orientation. In the 2D variant, a is used with a 4-point to provide balanced suitable for generation. The stretch factor is -0.211324865405187 and the squish factor is 0.366025403784439. The variant employs a tetrahedral for smooth gradients in spatial volumes, utilizing a 7-point ; this is recommended for terrain generation due to its spatial coherence. The stretch factor is -\frac{1}{6}. For , the algorithm applies a simplicial (pentachoron) , incorporating an 8-point for coherent in animations or time-varying fields. The stretch factor is -0.138196601125011 and the squish factor is 0.309016994374947. The following table summarizes the key parameters for the primary dimensional variants:
DimensionLattice TypeKernel SizeStretch FactorSquish Factor
Hexagonal4-0.2113248654051870.366025403784439
Tetrahedral7-\frac{1}{6}\frac{1}{3}
Simplicial (pentachoron)8-0.1381966011250110.309016994374947

Properties

Visual and spectral qualities

OpenSimplex noise produces a smoother visual appearance than traditional , owing to its use of larger contribution kernels that reduce sharp transitions and introduce a subtle blurring effect, resulting in lower contrast and more gradual feature blending. This yields patterns in outputs, such as flowing formations or undulating surfaces, while effectively avoiding grid-aligned artifacts common in lattice-based noises. In higher dimensions, OpenSimplex noise exhibits improved compared to , with reduced directional bias. Kurt Spencer's original evaluations confirmed this through visual inspections and output range analyses, reporting normalized ranges like 0.060 to 0.932 in (from 80,000 samples), indicating consistent without extreme outliers. When layered via fractal Brownian motion (fBm), OpenSimplex noise supports realistic variation in applications such as planetary surfaces or atmospheric effects. In fBm applications, multiple octaves of OpenSimplex noise are summed with decreasing amplitudes and increasing frequencies, with Spencer's 4D variants showing superior pattern coherence over in such compositions. This enhances its utility for generating visually compelling, non-repetitive textures devoid of low-frequency artifacts.

Performance and computational aspects

OpenSimplex noise exhibits increased computational demands compared to classic primarily due to its larger contribution kernels, which evaluate more points per sample—for instance, 9 vertices in versus 3 in Simplex. This results in additional dot products and skewing operations, leading to roughly 50% slower in implementations. Benchmarks on modern hardware demonstrate practical efficiency for real-time applications, with 3D OpenSimplex generating approximately 37 million samples per second on an i7-7820X CPU clocked at 4.9 GHz using optimized C++ code. In contrast, equivalent 2D achieves about 71 million samples per second under similar conditions, underscoring the performance trade-off while still outperforming classic in higher dimensions, where Perlin's complexity grows exponentially with dimensionality. Memory usage remains efficient, relying on compact permutation tables of around 256 entries for gradient selection, comparable to Simplex noise and suitable for GPU environments without excessive overhead. Vectorized implementations, such as those in GLSL shaders, mitigate costs through SIMD instructions, enabling high-throughput generation in graphics rendering. Seeding via permutation shuffling further optimizes by eliminating per-sample randomness computations. OpenSimplex scales linearly with dimensionality like Simplex noise (O(n^2) operations), avoiding Perlin's O(2^n) scaling, which makes it preferable for applications despite overall higher demands in elevated dimensions; however, evaluations remain computationally intensive, often 2-3 times slower than on the same hardware.

Implementations

Software libraries and code

The original implementation of OpenSimplex noise was released in by Kurt Spencer in as a GitHub Gist. An updated version is hosted on at , providing variants for , 3D, and noise generation with support for seeding to ensure reproducible results. This serves as the foundation for subsequent ports and includes core functions for evaluating noise at given coordinates, emphasizing gradient-based computation without patent restrictions. Several open-source ports extend the original code to other programming languages. In , the opensimplex package offers a direct port, enabling easy integration into scripts for tasks. For C++, the FastNoiseLite library incorporates OpenSimplex variants, including optimized and modes, suitable for performance-critical applications like rendering. implementations, such as the open-simplex-noise package, facilitate web-based by providing TypeScript-compatible noise evaluation. Notable integrations appear in game engines. Engine included a built-in OpenSimplexNoise class from version 3.1 (released in 2018) to 3.x, allowing developers to configure parameters like seed, octaves, and period for sampling directly in GDScript or C#. In 4.0 (released in 2023) and later, it was replaced by the FastNoiseLite class, which supports OpenSimplex2 variants such as OpenSimplex2F and OpenSimplex2S. For , community-provided C# ports of OpenSimplex noise exist, often shared via or forums, with some bundled in toolkits for terrain and texture synthesis. Libraries commonly extend basic OpenSimplex evaluation with advanced features, such as modes—including ridged multifractal for sharper ridges and warping for twisting input coordinates to create complex patterns. These enhancements build on the core algorithm to support layered for natural-looking outputs. A basic sampling example in using the opensimplex demonstrates simple 2D generation:
python
import opensimplex

# Initialize with a [seed](/page/Seed) for [reproducibility](/page/Reproducibility)
opensimplex.seed(1234)

# Sample noise at coordinates (x, y)
noise_value = opensimplex.noise2(x=1.0, y=2.0)
print(noise_value)  # Outputs a value between -1 and 1
Similar snippets exist in other languages, typically involving initialization with a seed followed by coordinate-based queries. The OpenSimplex2 repository, last updated in 2022, includes extensions like SuperSimplex (OpenSimplex2S) for improved isotropy in higher dimensions. Forks and ports, including Rust implementations, continue to be developed as of 2025.

Usage in applications and engines

OpenSimplex noise has found widespread application in game engines for procedural content generation, particularly in creating natural-looking terrains and environments. In the engine, the built-in OpenSimplexNoise class, introduced in version 3.1 in 2018, enabled developers to generate for and in games, supporting features like seamless tiling and multi-octave layering for varied landscapes. In Godot 4.0 (2023) and later, the FastNoiseLite class provides similar functionality with OpenSimplex2 support. This integration allows indie developers to build expansive procedural worlds, such as dynamically generated levels in platformers and exploration titles, where the noise's isotropic properties help avoid directional artifacts in heightmaps. Beyond game engines, OpenSimplex noise is used in creative software for texture and environment manipulation through community scripts. In , a Lua-based OpenSimplex implementation released in 2021 facilitates dynamic environment generation, enabling users to create procedurally varied terrains and structures within user-generated games. Specific use cases highlight the versatility of OpenSimplex noise across dimensions. The variant is employed for animated textures, such as time-based looping formations, where the serves as a time parameter to create seamless animations without visible seams. In applications, it powers terrain generation in Minecraft-like games, using noise samples to define block densities for caves, overhangs, and surface features in procedural worlds. In voxel game development communities, OpenSimplex noise is favored for generating isotropic heightmaps that produce uniform, artifact-free elevations suitable for large-scale worlds. As of 2025, OpenSimplex noise is seeing increased integration in AI-driven procedural art tools, leveraging its open licensing to enhance generative algorithms for creating dynamic visuals in creative coding environments like .

References

  1. [1]
    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!
  2. [2]
    lmas/opensimplex: This repo has been migrated to https ... - GitHub
    May 5, 2024 · OpenSimplex noise is an n-dimensional gradient noise function that was developed in order to overcome the patent-related issues surrounding Simplex noise.
  3. [3]
    [PDF] SAN FRANCISCO JULY 22-26 Volume 19, Number 3, 1985 287
    We now introduce the most fundamental of these. Noise() is a scalar valued function which takes a three dimensional vector as its argument. It has the following ...
  4. [4]
    [PDF] CS248 - Noise
    Value noise. Fractal noise. Gradient noise. Perlin noise (SIGGRAPH 1985) ... Grid artifacts are more apparent. Sometimes good enough. Page 15. Simplest noise.
  5. [5]
    [PDF] Procedural Generation - Texas Computer Science
    Value noise: notice how there are clear diagonal streaks running ... One of the classic gradient noise functions. Can be used to generate values ...
  6. [6]
    [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 to ...Missing: invention | Show results with:invention
  7. [7]
    [PDF] Simplex noise demystified - CGVR
    Mar 22, 2005 · Perlin noise is a so-called gradient noise, which means that you set a pseudo-random gradient at regularly spaced points in space, and ...Missing: history | Show results with:history
  8. [8]
    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.
  9. [9]
    image processing - Simplex noise vs Perlin noise - Stack Overflow
    Jun 22, 2011 · Kenneth Perlin himself designed the simplex algorithm for an hardware based implementation and thus made design decisions that make this easier.Why does simplex noise seem to have *more* artifacts than classic ...Perlin Noise for 1D? - Stack OverflowMore results from stackoverflow.com
  10. [10]
    A cellular texture basis function | Proceedings of the 23rd annual ...
    SIGGRAPH '96 · A cellular texture basis function. Article. Free access. Share on. A cellular texture basis function. Author: Steven Worley. Steven Worley. 405 ...
  11. [11]
    A port of Kurt Spencer's OpenSimplex to Go - GitHub
    Jan 31, 2025 · OpenSimplex noise is a random noise algorithm by Kurt Spencer, made as a patent-free alternative to Perlin and Simplex noise.
  12. [12]
    Open Simplex Noise source code - GitHub Gist
    Open Simplex Noise source code. GitHub Gist: instantly share code, notes, and snippets ... * OpenSimplex Noise in Java. * by Kurt Spencer. *. * v1.1 (October 5, ...
  13. [13]
    Using noise generation to generate map - JVM Gaming
    Dec 15, 2015 · OpenSimplexNoise.java. /* * OpenSimplex Noise in Java. * by Kurt Spencer * * v1.1 (October 5, 2014) * - Added 2D and 4D implementations. * - ...
  14. [14]
    opensimplexnoise.pde - GitHub Gist
    * OpenSimplex Noise in Java. * by Kurt Spencer. *. * v1.1 (October 5, 2014). * - Added ...
  15. [15]
    KdotJPG/OpenSimplex2: Successors to OpenSimplex Noise, plus ...
    Uses large vertex contribution ranges like 2014 OpenSimplex, but has better uniformity in 3D and 4D. 3D is implemented analogously to OpenSimplex2(F), but finds ...
  16. [16]
    Visually isotropic coherent noise algorithm based on ... - GitHub Gist
    * 2D OpenSimplex2S/SuperSimplex noise, with Y pointing down the main diagonal. * Might be better for a 2D sandbox style game, where Y is vertical. * Probably ...
  17. [17]
    Noise, Perlin, 1/f Noise, Modelling planets - Paul Bourke
    QuickTime 1/f noise can be created using random noise generators but it can also be producted using deterministic functions.
  18. [18]
    Auburn/FastNoiseLite: Fast Portable Noise Library - C# C++ C Java ...
    Million points of noise generated per second (higher = better). 3D, Value ... @KdotJPG for implementing all the OpenSimplex algorithms and the Java port ...
  19. [19]
    opensimplex - PyPI
    OpenSimplex noise is an n-dimensional gradient noise function that was developed in order to overcome the patent-related issues surrounding Simplex noise.Missing: announcement 2014
  20. [20]
    OpenSimplexNoise — Godot Engine (3.5) documentation in English
    This resource allows you to configure and sample a fractal noise space. Here is a brief usage example that configures an OpenSimplexNoise and gets samples.
  21. [21]
  22. [22]
    Simplex noise lands in Godot 3.1
    Sep 19, 2018 · Simplex noise, using OpenSimplex, is now in Godot 3.1, useful for procedural generation and visual effects, and can be generated via GDScript.<|separator|>
  23. [23]
    OpenSimplex Noise in Lua! - Developer Forum | Roblox
    Mar 18, 2021 · 3D Re-oriented 8-point BCC noise, with better visual isotropy in (X, Y). Recommended for 3D terrain and time-varied animations.<|control11|><|separator|>
  24. [24]
    Will Simplex Noise ever be implemented into Blender?
    Aug 5, 2023 · Ken Perlin's patent of Simplex Noise has expired in January of last year, and it's said to be superior to original Perlin Noise.Missing: date | Show results with:date
  25. [25]
    Dennis-van-Gils/opensimplex-loops: Python library to generate ...
    Python library to generate seamlessly-looping animated images and closed curves, and seamlessy-tileable images. Based on 4D OpenSimplex noise.
  26. [26]
    Generating Voxel Planet using 3D Simplex Noise | by Hitesh Sahu
    Mar 21, 2020 · Simplex noise has no noticeable directional artifacts, though noise generated for different dimensions is visually distinct (e.g. 2D noise has ...Missing: drawbacks | Show results with:drawbacks
  27. [27]
    Noise - Voxel.Wiki
    Due to patent shenanigans, simplex noise was not possible to freely implement for quite some time, leading to the creation of open simplex noise. Thankfully, ...
  28. [28]
    max-mapper/voxel-simplex-terrain - GitHub
    generate voxel terrain using simplex noise. Contribute to max-mapper/voxel-simplex-terrain development by creating an account on GitHub.
  29. [29]
    OpenSimplex Noise: The Evolution of Noise Representation
    Apr 24, 2025 · This article will guide you through integrating OpenSimplex Noise into Processing, exploring its features and benefits by comparing it directly with the ...Perlin Noise, Simplex Noise... · 1. Perlin Noise And Its... · 2. Opensimplex Noise