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=0n1Aif(Fix)\text{FBM}(x) = \sum_{i=0}^{n-1} A_i \cdot f(F_i \cdot x)

Where:

  • Ai=A0riA_i = A_0 \cdot r^i (amplitude progression)
  • Fi=F0siF_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)
}
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)
}