Notice, this site could originally be found at the following link, and I pulled this from the web backup link
http://freespace.virgin.net/hugo.elias/models/m_perlin.htm
https://web.archive.org/web/20160510013854/http://freespace.virgin.net/hugo.elias/models/m_perlin.htm
I was not involved in making this article and I'm only hosting it here as another backup
Introduction To Noise Functions
|
|
|
|
Definitions
Sin Wave | |
Noise Wave |
|
|
|
Persistence
frequency = 2i amplitude = persistencei
Frequency | 1 | 2 | 4 | 8 | 16 | 32 | ||||||||
Persistence = 1/4 | + | + | + | + | + | = | ||||||||
Amplitude: | 1 | 1/4 | 1/16 | 1/64 | 1/256 | 1/1024 | result | |||||||
Persistence = 1/2 | + | + | + | + | + | = | ||||||||
Amplitude: | 1 | 1/2 | 1/4 | 1/8 | 1/16 | 1/32 | result | |||||||
Persistence = 1 / root2 | + | + | + | + | + | = | ||||||||
Amplitude: | 1 | 1/1.414 | 1/2 | 1/2.828 | 1/4 | 1/5.656 | result | |||||||
Persistence = 1 | + | + | + | + | + | = | ||||||||
Amplitude: | 1 | 1 | 1 | 1 | 1 | 1 | result |
Octaves
Making your noise functions
function IntNoise(32-bit integer: x) x = (x<<13) ^ x; return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0); end IntNoise function |
Interpolation
Linear Interpolation:
|
||
Cosine Interpolation:
|
||
Cubic Interpolation:
|
Smoothed Noise
|
|
function Noise(x) . . end function function SmoothNoise_1D(x) return Noise(x)/2 + Noise(x-1)/4 + Noise(x+1)/4 end function |
2-dimensional Smooth Noise
function Noise(x, y) . . end function function SmoothNoise_2D(x>, y) corners = ( Noise(x-1, y-1)+Noise(x+1, y-1)+Noise(x-1, y+1)+Noise(x+1, y+1) ) / 16 sides = ( Noise(x-1, y) +Noise(x+1, y) +Noise(x, y-1) +Noise(x, y+1) ) / 8 center = Noise(x, y) / 4 return corners + sides + center end function |
Putting it all together
1-dimensional Perlin Noise Pseudo code
function Noise1(integer x) x = (x<<13) ^ x; return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0); end function function SmoothedNoise_1(float x) return Noise(x)/2 + Noise(x-1)/4 + Noise(x+1)/4 end function function InterpolatedNoise_1(float x) integer_X = int(x) fractional_X = x - integer_X v1 = SmoothedNoise1(integer_X) v2 = SmoothedNoise1(integer_X + 1) return Interpolate(v1 , v2 , fractional_X) end function function PerlinNoise_1D(float x) total = 0 p = persistence n = Number_Of_Octaves - 1 loop i from 0 to n frequency = 2i amplitude = pi total = total + InterpolatedNoisei(x * frequency) * amplitude end of i loop return total end function |
2-dimensional Perlin Noise Pseudocode
function Noise1(integer x, integer y) n = x + y * 57 n = (n<<13) ^ n; return ( 1.0 - ( (n * (n * n * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0); end function function SmoothNoise_1(float x, float y) corners = ( Noise(x-1, y-1)+Noise(x+1, y-1)+Noise(x-1, y+1)+Noise(x+1, y+1) ) / 16 sides = ( Noise(x-1, y) +Noise(x+1, y) +Noise(x, y-1) +Noise(x, y+1) ) / 8 center = Noise(x, y) / 4 return corners + sides + center end function function InterpolatedNoise_1(float x, float y) integer_X = int(x) fractional_X = x - integer_X integer_Y = int(y) fractional_Y = y - integer_Y v1 = SmoothedNoise1(integer_X, integer_Y) v2 = SmoothedNoise1(integer_X + 1, integer_Y) v3 = SmoothedNoise1(integer_X, integer_Y + 1) v4 = SmoothedNoise1(integer_X + 1, integer_Y + 1) i1 = Interpolate(v1 , v2 , fractional_X) i2 = Interpolate(v3 , v4 , fractional_X) return Interpolate(i1 , i2 , fractional_Y) end function function PerlinNoise_2D(float x, float y) total = 0 p = persistence n = Number_Of_Octaves - 1 loop i from 0 to n frequency = 2i amplitude = pi total = total + InterpolatedNoisei(x * frequency, y * frequency) * amplitude end of i loop return total end function |
Applications of Perlin Noise
1 dimensional
Controlling virtual beings: |
|
Drawing sketched lines: |
See: Creating Informal Looking Interfaces.
|
2 dimensional
Landscapes: |
|
Clouds: |
|
Generating Textures: |
|
3 dimensional
3D Clouds: |
|
Animated Clouds: |
|
Solid Textures: |
|
4 dimensional
Animated 3D Textures and Clouds: |
|
Copyright Matt Fairclough 1998 |
The land, clouds and water in this picture were all mathematically generated with Perlin Noise, and rendered with Terragen. |
The clouds in this demo are animated with 3D perlin Noise. The algorithm had to be modified slightly to be able to produce Perlin Noise in real time. See the Clouds Article for more info on how this was done. |
Generating Textures with Perlin Noise
The following textures were made with 3D Perlin Noise
|
|
|
|
|
|
texture = cosine( x + perlin(x,y,z) ) |
|
|
g = perlin(x,y,z) * 20 grain = g - int(g) bumps = perlin(x*50, y*50, z*20) if bumps < .5 then bumps = 0 else bumps = 1t |
References
Procedural textures: http://developer.intel.com/drg/mmx/appnotes/proctex.htm
Ken Perlin's Homepage: http://mrl.nyu.edu/perlin/
Texturing And Modeling A Procedural Approach: http://www.cs.umbc.edu/~ebert/book/book.html
Procedural Texture Page: http://www.threedgraphics.com/pixelloom/tex_synth.html
Return to the Good Looking Textured Light Sourced Bouncy Fun Smart and Stretchy Page.