Procedural Noise Categories
Three categories of procedural noise functions are examined in this section. They are
A list of questions and answers concerning procedural noise is available at the Procedural Noise FAQ page.
Lattice Gradient Noises
Lattice noises involve interpolating or convolving noise or noise gradients that are defined at lattice or grid points which are defined on an integer scale. The most widely known form of lattice noise is Perlin Noise, which is discussed briefly below and then explored in greater depth later on in its own case study.
In the book Texture and Modeling, Ebert et al. discuss several forms of lattice noises while providing accompanying terminology.
- Lattice Noises
- Noise functions based on the integer lattice. The integer lattice is formed from the creation of evenly distributed pseudorandom numbers. These numbers are mapped into the texture space such that each coordinate occurs at an integer value.
- Value Noises
- Noise functions based on values. Specifically, given a pseudorandom number (PRN) at each lattice point, a new value can be interpolated anywhere in between these random values. This interpolation acts as a smoothing operation and is equivalent to low pass filtering. Hence, value noise is one of the simplest ways to generate a low-pass filtered random or stochastic function.
- Gradient Noises
- Noises based on gradients. Gradient noises offer an alternative method of generating a low-pass filtered stochastic function by using the PRN's at each lattice point to come up with gradient vectors which are used instead of the values themselves. Perlin noise is, and was the fist, gradient noise.
- Value-Gradient Noises
- Noises based on values and gradients. One problem that can arise with gradient noises has to do with a noticeable grid pattern as a result of the gradient being zero at each lattice point. One method of combating this problem, while retaining the specular control of gradient noise is to combine value and gradient noise methods. A weighted sum of each function is one way to accomplish this.
- Lattice Gradient Noises
- The collective term used by Lagae et al. to classify and group all of these noises since Perlin Noise is a lattice noise and the most popular of all noise functions in these categories.
- Perlin Noise
- Perlin noise is a gradient noise (of the lattice noise family). It is implemented by producing random vectors whose components are within the range [-1, 1]. If the magnitude of the vector is greater than one then it lies outside of the unit circle or sphere (depending on the dimension desired) and is discarded, otherwise it is kept. If the vectors that fell outside of the unit sphere were kept, it would bias the noise toward the corners of the cube and produced undesirable visual artifacts.
The above plots show Perlin noise as it appears using the same number of sample points (256x256) to cover various sized grids. The notion of octaves is shown here, where different levels of detail can be achieved by zooming in or out of the noise.
- Simplex Noise
- Simplex noise is different from the previous lattice noise definition in that it does not use integer points for its lattices. It is similar to Perlin noise, but based on a simplex grid.
- Lattice Convolution Noise
- Here is another lattice noise that does not use integer based lattice points. Instead, a more evenly distributed and denser set of points are used to establish its grid. The inspiration for this came from the notion of sphere packing.
- Better Gradient Noise
- This noise offers several improvements over Perlin noise. Axial decorrelation was improved by using a different hash function and gradient table. Band limitations were also improved with the use of a new reconstruction kernel.
- Curl Noise and Flow Noise
- Curl noise is similar to Perlin noise, but is instead used for physically based simulations to produce "time-varying incompressible turbulent velocity fields." Flow noise is another noise used for physical simulations. It is useful for producing time-varying textures with swirling behavior.
Explicit noises are different than noise functions in that they generate their noise in advance and then store it for later retrieval. They do not respond with a particular output noise value based on some function definition and input parameters. Two well-known types of explicit noise are wavelet noise and anisotropic noise.
- Wavelet Noise
- A major benefit to wavelet noise over Perlin noise is that it is nearly perfectly band-limited due to the up-down sampling iterative filtering operations. Once the noise has been produced, it can then be accessed and interpolated in a similar manner as the other methods described. Wavelet noise can be generated in the following manner.
- A 2D texture of noise is generated.
- The 2D texture is down-sampled and then up-sampled to the original dimensions.
- The down-up-sampled texture is then subtracted from the original image to produce the information that is not representable at half-size.
The above plots, generated in Matlab, illustrate the outlined steps in a clockwise manner beginning with the upper right plot.
- Anisotropic Noise
- Anisotropic noise offers a solution to the inherent trade-off found in isotropic filtering between losing detail and artifacts from aliasing. The key observation of anisotropic noise is to divide the frequency domain into oriented subbands. Generating the noise is done using steerable filters which allow control over the orientation and range of the subbands as well as perfect reconstruction of the original signal from the subbands due to the frequency band-limitations of the subbands. This is helpful in eliminating artifacts from linear interpolations.
- Stochastic Subdivision
- This is useful in generating naturally occurring fractal like phenomena such as terrain and is accomplished through the use of a stochastic subdivision algorithm, namely the midpoint displacement method.
- Fourier Spectral Synthesis
- This method is particularly useful when a specific power spectrum is known or desired. A wideband power spectrum is first created from white noise (uniform distribution) and then filtered to produce a desired frequency range or spectral shape. It has been used in explicit noise methods as well as for the generation of random fractals for recreating natural phenomenon.
The above plots show how white noise can be filtered into different frequency bands. Using two dimensions, different filters can be applied along each dimension. The plots on the left were first filtered to a low band frequency range, and then filtered along the other dimension using a low, medium, and high bandpass filter. The right hand set of plots were filtered along each dimension using the bandpass filter specified in the title of the respective plots.
Most often, these frequency bands are transformed back into the spatial domain for use as textures, though interesting results can be produced by remaining in the frequency domain alone, as shown below (note that the effects of the lower left plot below are actually a result from aliasing).
The computational cost of running the FFT and/or IFFT to transform between domains, however, makes Fourier spectral synthesis methods less popular than the lattice or sparse convolution methods.
Sparse Convolution Noises
Sparse convolution noises use other methods to generate noise that are not based on a regular lattice of pseudorandom numbers (PRN).
- Sparse Convolution Noise
This method of generating noise involves taking random samples from a set of PRNs and filtering. Control over the power spectrum is provided in the filter parameters. The term sparse here comes about because the random sampling of the PRNs is considered a sparse form of white noise. One draw back to this method over a lattice convolution noise is that the search space is increased for each call to the algorithm, which is computationally expensive. The steps in generating such a kernel to use in convolution are as follows
- Generate white noise (technically this should be converted to the frequency domain, but the frequency domain is also white noise so the step can be skipped (i.e. consider the generated white noise to be the spectrum of another set of generated white noise)
- Filter the noise to produce the desired spectral result
- Invert/transform the signal back to the spatial domain
Window the result to produce the kernel to be used for convolution.
- Spot Noise
- Spot noise is unique in that it shares properties of both sparse convolution noise and explicit noise. It is particularly useful for mapping textures to parametric surfaces as well as generating textures over curved surfaces.
- Gabor Noise
- This method follows the similar idea of convolution, but is unique in its choice of kernel. One of the drawbacks to sparse convolution noise is that more often than not a poor kernel is generated that reveals structure in the noise; violating the ideal noise requirements. Gabor noise solves this problem by using a kernel that is a combination of a Gaussian curve and a sinusoidal curve, both in two-dimensions. An example of how to create a Gabor Noise kernel is shown in the Matlab plots below.
- The initial circular Gaussian curve is shown in the top image, and the cosine function necessary to modulate it with to produce the Gabor kernel is shown in the left-center plot. Creating various types of kernels in this way is quite straight-forward, so much so that I made one of my own (Kernel Hyatt).