Fractional Brownian Motion
Overview
Fractional Brownian Motion is a 2d noise algorithm used in computer graphics to produce textures.
Monolith implements an fBM based on shader code found in the Book of Shaders. When used with Domain Warping, fBM can be used to produce very complex textures out of a simple set of rules. When time is a factor, the textures can even move and swirl like some kind of cloudy liquid.
Sample Code
The following Janet code uses monolith/fbm
to render
a 320x200 PNG image of a black and white fractal brownian
motion texture.
<<test_fbm.janet>>=
(def width 320)
(def height 200)
(def noctaves 5)
(def white @(255 255 255))
(def black @(0 0 0))
(monolith/gfx-fb-init)
(monolith/gfx-setsize 320 200)
(defn color [x y c]
(monolith/gfx-pixel-set
x y (math/floor (c 0)) (math/floor (c 1)) (math/floor (c 2)) 255))
(defn colorlerp [c1 c2 a]
(array
(+ (* a (c2 0)) (* (- 1 a) (c1 0)))
(+ (* a (c2 1)) (* (- 1 a) (c1 1)))
(+ (* a (c2 2)) (* (- 1 a) (c1 2)))))
(for ypos 0 height
(for xpos 0 width
(var x (/ xpos width))
(var y (/ ypos height))
(set x (* x (/ width height)))
(set y (* y 4))
(set x (* x 4))
(var fa (monolith/fbm x y noctaves))
(var fb (monolith/fbm (+ x fa) (+ y fa) noctaves))
(var amp (monolith/fbm (+ x fb) (+ y fb) noctaves))
(color xpos ypos (colorlerp black white amp))))
(monolith/gfx-write-png "fbm.png")
A deeper dive
monolith_fbm
, the core C function behind the Janet
function monolith/fbm
can be found in
fbm.c in the section 4. Top-Level FBM Function.
Janet bindings can be found in fbm.c in the section 3. Janet Loader.