Microbot – David Fuhrer

David Fuhrer - Houdini 3D Generalist

f(p) = fbm( p + fbm( p + fbm( p ) ) )

When I started with Houdini one of the first things I made where tools to generate Planet Displacement Maps for Artists. It’s all about Noise, especially useful for terrain is the Fractal Brownian Noise approach: https://en.wikipedia.org/wiki/Fractional_Brownian_motion

The approach comes from Inigo, he’s at another level when it comes to CG and Math:
https://www.iquilezles.org/www/articles/fbm/fbm.htm

This is the implementation I did in VEX, this might not be correct but worked well enough for my experiments, you can run this in a volume wrangle. Make sure you premake layers in following order: Cd.r, Cd.g, Cd.b, use a copy layer operator for that. Its important if you want to write RGB values into a 2D heightfield to have these 3 layers.

float fbm( vector x; float H)
{
float G = pow(exp(-H), .6666);
float f = 1.0;
float a = 1.0;
float t = 0.0;
//how many octaves:
for( int i=0; i < 8; i++ )
{
//anoise is alligator noise, try noise() or other noises here, its fun to play around with
t += anoise(f*x);
f *= 2.0;
a *= G;
}
return t;
}

//Then you can do something like this:
vector2 q;
vector2 r;
vector p = @P/1000 + chv('offset');
q.x = fbm( p + (0.0,0.0), 1.5 ); 
q.y = fbm( p + (4.2,1.3), 0.91 );
r.x = fbm( p + 4.0q + (1.7,9.2), 0.8 ); 
r.y = fbm( p + 4.0q + (8.3,2.8), 4.5 );
float f = fbm( p + 2.5*r, 2.1);

//Mix between 2 gradients with q.x as threshold:
@Cd = lerp(chramp('rmp', f), chramp('rmp2', f2), q.x);

All the following Images are generated with that code. I give the algorithm a color palette and feed it some random numbers and it gives an infinite amount of possible outputs

Next Post

Previous Post

© 2025 Microbot – David Fuhrer