I have been playing around for a day with Perlin noise, and I am currently stuck. Most of the modifications I have made to the algorithm produce more or less the following:

Perlin noice

Now, this is a very good start, but the idea is to generate terrain similar to real life (as close as I can get at least). Rivers and lakes would be nice to have, but that's way ahead in the schedule, right now I would like some help understanding 2 things.

Let's say that in my image, black is water and grey is land this is quite unlike the earth's shores. On earth continents are large masses of land and if they are cut by watter, it's usually on large areas (Imagine the Mexican gulf or the Mediterranean sea). However my image has a lot of narrow elongated "peninsulas" with patches of water around it. Due to the nature of Perlin noise (the square grid with the underlying random vector field) I am not sure how to create those large clusters of land and water.

The other problem is vertical, if we see the grey scale as a height map, these islands are too odd. In real life one would have large sections of flat land with elongated mountain ranges cutting through.

Some options that I have considered are, changing the smoothing/fade function in the improved Perlin noise algorithm for one that extends over multiple squares in the grid, but this adds too much computational complexity. I have also considered changing the vector field generation from pseudo random to one that follows a pattern, but this doesn't seem like it would actually solve the problem given that Perlin noise, as is, doesn't seem able to generate large consistent clusters.


I know about octaves, but they have their limitations, re-sampling perlin noise at different frequencies and amplitudes does change the terrain generation and ca give you some good results: enter image description here

But even this has issues. For example if I want smooth hills I loose jaggy shores, same as if I try to create more valleys. And doing this also reduces the likelihood of generating islands in the middle of the bodies of water, moreover in terms of topography, the mountains look chaotic, they don't really from mountain ranges, they rather spread semi-chaoticly, which is not exactly what I need.

  • $\begingroup$ I recommend using (Open)Simplex Noise instead of Perlin Noise, because you'll have 'integer slices' with Perlin Noise. Perlin (top) compared to OpenSimplex (bottom): i.sstatic.net/Rlib0.png $\endgroup$ Commented Sep 10, 2019 at 10:00

3 Answers 3


Perlin noise is just a base block, not very interesting by itself. You don't need to modify it, but to combine and filter it in interesting ways. Look at how to make fractal Brownian motion (fBm) with it for example, which combines octaves based on few parameters to get a richer texture.

The question of terrain rendering is a difficult one and a topic of active research. Many generated terrains have this artificial and uninteresting look. This is exactly what the paper "Modeling Real-World Terrain with Exponentially Distributed Noise" tries to address, by proposing a formula based on statistics measured from actual terrain, which yields more convincing shapes.

Another source of valuable information is Iñigo Quilez's website, where he mentions procedural generation a lot, including tricks to fake erosion.

  • 1
    $\begingroup$ See also Giliam de Carpentier's series of articles on terrain on his blog—look for the "Scape" articles. $\endgroup$ Commented Nov 10, 2017 at 23:23

Here’s a video that talks about a couple different techniques.

One idea mentioned in the video is to take the values from 0.0 to 1.0 you get from the noise and only care about ones within a certain range, (mapping the rest to 0.0). Further, you can map the values in that range to different values, following a curve. For instance if you take the values between 0.25 and 0.75 you can map 0.5 to 1.0 and fill in the values in between with a straight line.

Another technique mentioned is to compose your noise function. Say you have a noise function that takes a 2d vector, you can call Vec2(Noise(pos), Noise(pos + offset)) to get a vector you can put into the noise function again. This gives an interesting skewed/streaky look.


Perlin noise not good for real planet surface because planet surface is not random. Planet structure is create by geology/physics and interaction between different parts.

This video show geology simulator have name PlaTec (have link in text below video):

Link have source code at SourceForge web site too.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.