# Procedural terrain using 3D noise

I'm coding a procedural terrain generation based on this article from GPU Gems 1.

But using CPU (not GPU). I'm stuck at generating the procedural terrain. I just can't figure out how make a 3D texture the way it looks in the article (fig. 1-10). Am I missing something big here? Here is the code:

``````float CTerrain::DensityFunction(float x, float y, float z) {
CPerlin3DTexture perl_tex;
float noise;
uint32_t octaves = 3;
float amplitude[10] = {0.25,0.5,1.0,1.9,4.1,8.1,16.1,9,10};
float lacunarity = 1.5;
float freq[10] = {4.03,1.96,1.01,0.51,0.2487,0.12563,0.8013,0.39913, 0, 0};
uint32_t i;

noise = 0.0;
for(i=0; i < octaves; ++i ) {
noise += perl_tex.noise(x * freq[i],
y * freq[i],
z * freq[i]) * amplitude[i];
x *= lacunarity;
y *= lacunarity;
z *= lacunarity;
}

return noise;
}
``````

Values (nx,ny,nz) = (128,128,10)

``````float ***CTerrain::GenerateDensityTexture(uint32_t nx, uint32_t ny, uint32_t nz) {
float step[3];
int32_t i, j, k;

step[0] = 1.0 / (float)nx;
step[1] = 1.0 / (float)ny;
step[2] = 1.0 / (float)nz;
for(i = 1; i < nx-1; i++) {
for(j = 1; j < ny-1; j++) {
for(k = 1; k < nz-1; k++) {
tex[i][j][k] = DensityFunction((float)i * step[0],
(float)j * step[1],
(float)k * step[2]);
}
}
}

return tex;
}
``````

Help, anybody? This is what I get from the above code:

-
J/K: It's good, now adapt and make a game that utilizes it! – joltmode Jul 23 '12 at 16:04
It's not good. There should be no caves and overhangs when using 3 octaves. – kafka Jul 23 '12 at 16:15
J/K = Just Kidding. – Byte56 Jul 23 '12 at 16:34
Why should there be no caves and overhangs when using 3 octaves? You're using 3D noise, so there will generally be caves and overhangs even with 1 octave. Also, to my eyes the biggest problem with the screenshots you show looks like just not enough resolution in the polygonization. – Nathan Reed Jul 23 '12 at 17:52
Ok, here's another screenshot, same code but with nz=20 instead of 10 (a bit thicker). There's enough resolution, it's just that lacuranity is set very high (a typo, should be 5). If it's lower (1.5), the problem is even more obvious (right pic). link – kafka Jul 23 '12 at 19:47

In the article, the base density function is `float density = -ws.y;` This means that at high altitudes, the density will definitely `>= 0` producing completely air, and at low altitudes `density < 1` producing solid land.