Perlin noise

From David's Wiki
\( \newcommand{\P}[]{\unicode{xB6}} \newcommand{\AA}[]{\unicode{x212B}} \newcommand{\empty}[]{\emptyset} \newcommand{\O}[]{\emptyset} \newcommand{\Alpha}[]{Α} \newcommand{\Beta}[]{Β} \newcommand{\Epsilon}[]{Ε} \newcommand{\Iota}[]{Ι} \newcommand{\Kappa}[]{Κ} \newcommand{\Rho}[]{Ρ} \newcommand{\Tau}[]{Τ} \newcommand{\Zeta}[]{Ζ} \newcommand{\Mu}[]{\unicode{x039C}} \newcommand{\Chi}[]{Χ} \newcommand{\Eta}[]{\unicode{x0397}} \newcommand{\Nu}[]{\unicode{x039D}} \newcommand{\Omicron}[]{\unicode{x039F}} \DeclareMathOperator{\sgn}{sgn} \def\oiint{\mathop{\vcenter{\mathchoice{\huge\unicode{x222F}\,}{\unicode{x222F}}{\unicode{x222F}}{\unicode{x222F}}}\,}\nolimits} \def\oiiint{\mathop{\vcenter{\mathchoice{\huge\unicode{x2230}\,}{\unicode{x2230}}{\unicode{x2230}}{\unicode{x2230}}}\,}\nolimits} \)

Algorithm

  1. Generate a grid of random unit-length vectors
    • In improved perlin noise, vectors which only contain +=1 and 0 such as (1, 1, 0) are used
  2. For each point, find the closest corners in the grid and compute the dot product between the vector from the corner and the corner's random vector. This results in 4 values for each pixel, one for each corner.
  3. Interpolate between these using smoothstep.
    • In improved perlin noise, use smootherstep which has zero first and second derivatives at the boundaries:
    • \(\displaystyle \operatorname{smootherstep}(x) = 6x^5 - 15x^4 + 10x^3\)

Resources