# Noise Synthesis

In this method, the standard random number generator is replaced with a more controlled generator. Instead of successive random numbers in the series being completely unrelated, random numbers from locations which are 'close' are similar. This concept was (AFAIK) introduced by Perlin in the mid-80s under the area of procedural textures; a recent reference is Texturing and Modeling: A Procedural Approach.

There are several ways to compute solid noise, which typically use linear or cubic interpolation from a lattice of points. Beyond that basic concept, there are many ways of implementing noise.

Some code to implement these functions (from the Perlin reference) is available at ftp://archive.cs.umbc.edu/pub/texture. Additional (older) code can be found for the Siggraph '92 course notes at ftp://archive.cis.ohio-state.edu/pub/siggraph92. I've ported some of this code to Java so you can see noise synthesis in action.

For terrain surface applications, the lattice is 2D and interpolation is either bilinear or bicubic, just like a spline surface. The difference is that, where the spline surface stops after a single evaluation, the noise function is called multiple times for higher frequencies, stopping at a user-specified threshold. At each successive call to the noise function, the location values are scaled up and the resulting noise value is scaled down. When the location scale is 2 and the amplitude scale is .5, noise synthesis is similar to subdivision in which random numbers are added to each point at each level of the subdivision.

For building a planet, use 3D noise and use the Cartesian coordinates of points on the surface of the sphere to find height variations. This approach is used by Torben Mogensen in his planet generator, which I have ported to Java. The noise function in this program differs significantly from Perlin noise, and is worth studying.

An advantage of noise synthesis is that the terrain can be infinite in extent with little problem, where other methods require special manipulation to extend the terrain beyond it's original boundaries. A possible disadvantage is that the pool of random numbers is smaller.

To avoid problems near location (0,0), 'phase' information can be added to (x,y) to ensure that higher frequencies move elsewhere in the lattice.

Depending on the noise function used, there may be some additional problems or constraints. For example, if your noise function depends on interpolation from an explicit lattice of points, the lattice dimensions should be prime relative to the location scale used between 'octaves'. Otherwise your random numbers are likely to show some undesirable patterning. (At least this is a limitation if I understand the method correctly; YMMV and check the references.)

# References

Would you like to own this book?