Skip to main content

fbm: Multi-Scale Pattern Generation

Hierarchical Noise Composition Through Octave Layering​

Fractional Brownian Motion constructs complex organic patterns by accumulating multiple octaves of noise functions at varying frequencies and amplitudes. Each successive layer contributes finer detail while maintaining coherent structure across different scales.

Mathematical Foundation​

FBM accumulates nn octaves of noise function f(x)f(x) with geometric progression parameters:

FBM(x)=∑i=0n−1Ai⋅f(Fi⋅x)\text{FBM}(x) = \sum_{i=0}^{n-1} A_i \cdot f(F_i \cdot x)

Where:

  • Ai=A0⋅riA_i = A_0 \cdot r^i (amplitude progression)
  • Fi=F0⋅siF_i = F_0 \cdot s^i (frequency progression)
  • r=0.5r = 0.5 (amplitude reduction factor, persistence)
  • s=2s = 2 (frequency scaling factor, lacunarity)

Parameter Configuration​

ParameterDefaultDescription
Octaves4Number of noise layers
Initial Amplitude0.5Starting amplitude value
Amplitude Scalar0.5Amplitude reduction per octave
Scale Scalar2Frequency increase per octave

Function Variants​

FunctionInput TypePurpose
fbmVec2vec22D FBM using simplex noise
fbmVec3vec33D FBM using simplex noise
fbmVec3Tiledvec3, floatTileable 3D FBM using gradient noise

Implementation​

Live Editor

const fragment = () => {
      const p = uv.mul(3)
      const base = fbmVec2(p.add(iTime))
      const warped = fbmVec2(p.add(vec2(base)))
      const detail = base.add(warped)
      return vec4(detail.mul(0.5).add(0.5), base.mul(warped), detail.pow(2), 1)
}
Result
Loading...
Live Editor

const fragment = () => {
      const p = vec3(uv.mul(2), iTime.mul(0.1))
      const layers = fbmVec3(p)
      const ridged = layers.abs().mul(-1).add(1)
      const turbulence = fbmVec3(p.mul(2)).mul(0.3)
      const final = ridged.add(turbulence)
      return vec4(vec3(final), 1)
}
Result
Loading...