# noiseDetail in openFrameworks

Hey gang,

How would you recreate the effects of noiseDetail for graphics in processing, but using openFrameworks?

Any help appreciated.

Thanks,
James

Hi RaCompTeur,

Your question interest me so I’ve just done some researches and tries that I can share.

This implementation is “Simplex Noise” as presented by Ken Perlin […]

I’ve read that Simplex noise is an improved version of Perlin noise, and that they are gradient smooth functions. To create a more fractal noise, a common practice is to layer multiple perlin (or simplex) noise at different amplitudes and frequencies, which are the “octaves” you’re looking for. Here is a nice article about this.

It seems a little bit strange to me that I’ve found nothing about fractal noise in the OF core nor in the OF addons. Perhaps I’m missing something. A research about this topic in the forum lead to shader implementations, and this is probably a common use case, because CPU computation can be too slow in many cases.

Anyway, I made a CPU function that compute octaves noise (I just had to port the code from this neat page to OF):

``````float octavePerlin( float x, float y, float z, int octaves, float persistence )
{
float total = 0 ;
float frequency = 1 ;
float amplitude = 1 ;
float maxValue = 0 ;
for( int i = 0 ; i < octaves ; i++ )
{
total += ofNoise( x * frequency, y * frequency, z * frequency ) * amplitude ;
maxValue += amplitude ;
amplitude *= persistence ;
frequency *= 2 ;
}
}
`````` Here’s a demo application: octave-noise.zip (2,2 Ko)

I think the `octave` and `persistence` parameters have got the same effect that the `lod` and `falloff` parameters for the processing `noiseDetail()` function.

The zip also contains a class that can be used like that:

``````OctaveNoise noise ;
noise.setup( 8, 0.5f ) ; // p5 noiseDetail() like
float value = noise.get( 140.f, 20.f ); // 2D noise
``````
3 Likes

hello,

I’m sorry, but where do I get noise shaders, that are used in your code ?

``````noiseShader.load("shaders/vertex.vert", "shaders/classicnoise2D.frag");