Skip to content

Overview of procedural terrain generation tutorial

In this tutorial I describe how to implement a high quality terrain generation system using Godot + C# and gdshader. The implementation focuses on several techniques that are less common but, in my opinion, are useful.

The main design decisions for this project are:

  • Provide high customization while delivering reasonable performance and graphics.
  • Generate biome data based on the procedurally generated terrain aspects (e.g., elevation, slope, temperature). Store biome data on textures and use this for the ground shader. This allows for more realistic and customizable and biome generation.
  • Most of the terrain generation process is multi-threaded.
  • Skip implementing dynamic LOD(Level Of Detail) for the terrain mesh to keep the scope of this tutorial manageable. If you want to implement it yourself, the series by Sebastian Lague is a useful resource.
  • Implement a way to generate small objects(trees, grass, rocks, etc.) as well as big structures(e.g. buildings).
  • Deliberately avoid implementing any interactions with the terrain to once again keep the scope of this project reasonable. Design of the code should allow you to easily implement this yourself.
  • Implementation will allow for generation of infinite maps and therefore the terrain will need to be split into chunks. This will allow for efficient real-time map generation.

You can find source code for all the pages of this tutorial on the GitHub repo for this project by looking at the appropriate branches.

There are lots of different, online learning resources about procedural terrain generation but not all of them are useful. Here is a small list of useful ones.


If you find anything to improve in this project’s code, please create an issue describing it on the GitHub repository for this project. For website-related issues, create an issue here.

All pages on this site are written by a human, and you can access everything for free without ads. If you find this work valuable, please give a star to the GitHub repository for this project.