CS6554 Computer Graphics 2 – Lab 5 – Perlin Noise

In this lab, we were afforded the option of applying any of the topics presented in the last half of the term to our Renderer Project. I chose to implement Perlin Noise which is named for its pioneer Ken Perlin who won an Academy Award for this particular contribution to computer generated graphics. Perlin Noise can be used in a variety of ways to generate pseudo natural effects such as clouds, fire, terrain or even marble textures. The benefit of an approach like this is that complex and pseudo realistic textures can be generated procedurally from a small set of parameters as well as producing a texture that wraps exceedingly well in both the u and v directions.

The basis of the approach is to generate a signal lattice of random values. The lattice is processed at varying levels of resolution via interpolation to generate self-similar noise between resolutions of the lattice. At each noise level, the signal is compressed in amplitude and frequency. Once the granularity of a noise level reaches a satisfactory depth or is smaller than the resolution of a pixel, the noise generation is halted. The varying noise levels are then recombined into a single turbulence value for each pixel.

In the case of this implementation, bilinear interpolation was used to interpolate values in between the lattice values and noise was generated to a depth of five meaning that noise generation consisted of Noise(x), Noise(2x), Noise(4x), Noise(8x) and Noise(16x). Noise was then added back together using varying factors to produce the different turbulence textures displayed below.

These first five images help visualize each of the Noise(cx) levels. Noise(16x) is actually the lattice in this case, but this is neither a requirement nor a limitation on the implementation.

Noise(x) 64x64

Noise(2x) 64x64

Noise(4x) 64x64

Noise(8x) 64x64

Noise(16x) 64x64

The following image is the visualization of the turbulence that results from the addition of the above individual Noise levels.

Perlin Turbulence 64x64

Manipulation of the addition operation can produce a variety of turbulence results. Each of the following could be applied in a variety of applications. The labels are simply how I visualized the texture could be applied when I generated it.

Perlin Turbulence 'Clouds' 64x64

Perlin Turbulence 'Height Map' 64x64

Perlin Turbulence 'Height Map' 64x64

The following image is one of those happy accidents that can occur. This image is a Noise(x) level that I generated while playing with using absolute value. The resulting visualization clearly demonstrates how the textures generated wrap well in u and v and also clearly shows how a fundamental height map can be produced through the process which can then be reprocessed through the Perlin Noise algorithm.

Perlin Turbulence 'Rivers' 64x64

The following images are much larger textures generated by the same implementation. The lattice is still generated with the same resolution as the Noise(16x) level. Using a smaller lattice in these cases would produce much higher resolution/less pixelated textures but similar complexity (e.g. less busy) turbulence as the small textures above.

Perlin Turbulence 1024x1024

Perlin Turbulence 2 1024x1024

Perlin Turbulence 3 1024x1024

These following images are a large texture generated using a small lattice and demonstrate the high pixel, smooth transition, low complexity effect described above.

Perlin Turbulence With a Small Lattice 1024x1024

Perlin Turbulence With a Small Lattice 2 1024x1024

Finally the Perlin Texture is mapped to a sphere and demonstrates one application as clouds over a planet's surface.

Perlin Mapped Sphere

Comments are closed.