In 1983, Ken Perlin invented a special type of noise called Perlin noise. This type of noise has a wide range of applications in computer graphics, especially when generating natural scenes and animations, where it can effectively help create realistic physical effects. Perlin noise can be used to generate terrain, provide pseudo-random changes to variables, and update image textures. This post will dive into the background, uses, and importance of Perlin noise.
Ken Perlin's inspiration for the creation came from his frustration with the mechanical feel of computer-generated imagery (CGI) at the time. In 1985, he formally published a paper titled "An Image Synthesizer" at the SIGGRAPH conference, which detailed Perlin noise. His development was inspired in part by his work on Disney's 1982 computer-animated science fiction film Tron. Following the development of his technique, Perlin received an Academy Award in 1997 for his contributions to the art of creating natural-looking textures on computer-generated surfaces.
“Since the development of Perlin noise, computer graphics artists have been able to more realistically represent the complexity of natural phenomena.”
Perlin noise is a procedural texture element that is used as a gradient noise that gradually increases the realism of computer graphics. Although this feature has a pseudo-random nature, all visible details are of consistent size. This property makes it very controllable in operation; artists can plug multiple scaled copies of Perlin noise into mathematical expressions to create a wide variety of procedural textures. Synthetic textures generated using Perlin noise are often used in CGI to help computer-generated visual elements such as surfaces, fire, smoke, or clouds look more natural.
Perlin noise is usually implemented in two, three, or four dimensions, but can actually be defined in any dimension. The implementation typically involves three steps: defining a grid of random gradient vectors, computing the dot product of the gradient vectors with their offsets, and interpolating between these values.
Define an n-dimensional grid where each grid intersection is associated with a random n-dimensional unit-length gradient vector. This randomization helps create a natural texture effect.
To calculate the value of any candidate point, we first find the unique grid cell where the point is located, then identify the 2^n corners of the cell and their associated gradient vectors, and then calculate the offset vector for each corner and calculate the gradient vector for each corner. The dot product of the gradient vector at each corner is calculated with the offset vector. The influence of each grid corner increases with distance, which means that the normalization operation on the offset vector may introduce significant sharp changes, so it is more important to account for distance in the interpolation step.
The final step is to interpolate these dot products. This is done using a function that has zero first-order derivatives at 2^n grid nodes, so near each grid node the output will approximate the dot product of the node's gradient vector and the bias vector.
Complexity"Perlin noise is characterized by the fact that it passes through 0 at every node, which gives it its distinctive appearance."
For each evaluation of the noise function, the dot product of the position and the gradient vector must be calculated at each node that contains a grid cell. So the complexity of Perlin noise is O(2^n) as the dimension increases and the context increases. While Perlin noise still has its place in computation, new alternatives such as Simple Noise and OpenSimplex Noise have emerged that provide similar results with improved computational efficiency.
The invention of Perlin noise not only changed the way visual effects are created, but continues to influence our understanding of computer-generated imagery. In the future, how will technology further enhance our ability to recreate natural phenomena in the digital world?