This article will go over my personal workflow for creating a terrain. We will go over the quickest methods to create a playable terrain for your game world. There are many other things that someone has to keep in mind while creating a terrain for a game, like size, pixel density and the gameplay that the terrain affords. Those deserve an article on their own and therefore will not be discussed in this beginner article to: Terrain creation for Games.
There is no right or wrong way to create terrain. Some use only one program while others use many other programs in their pipeline. Use what fits your pipeline the best!
These are the programs I mainly use in my own personal workflow. But you can use any program that gets you the desired result. It is not about the tools but about your expertise on how to utilize them.
Starting with big shapes and adding smaller details on top
Creating terrain is similar to building houses. We start with the foundation of our terrain and slowly add structure and details to the terrain. Erosion, Terraces, Cliffs, Lakes, Roads and Trees.
Rough shape of the terrain. Created through sculpting, getting a real world data heightmap or procedurally generated with the generator nodes that programs like World Machine and Gaea provide. For the base terrain we won't care about the level of detail, we care about the general shape of the terrain.
With the base terrain we can start to add Macro Features on top. Think about the bigger shapes, big mountains. lake, crater or a valley.
When we have the big shapes in place, we can start to add the geological features to the terrain, adding detail to it. We can start to add elements of erosion to the terrain to make it look like it got some wear.
With use of data masks, we can use the data from the mask to drive certain aspects, like colorizing your terrain, deciding where trees will spawn and where they won't, if you want cliffs to appear at a 70 degree slope etc.
With the terrain and masks done, we will export the data maps to a game engine like Unreal Engine to continue with adding on top of our ecosystem. Adding trees and creating sophisticated way how pathways and roads get generated around your terrain, with use of Unreal Engines build in tools or with use of Houdini procedural toolset.
Keep it simple. Complexity comes from creating the masks and texturing it.
We will start from scratch and use the generator nodes that are available in World Machine / Gaea. You can create the base of your terrain however you want, you could even roughly sculpt out your terrain with use of programs like Zbrush / Blender to create your base or even use real world heightmap data to create the base terrain. For this short tutorial we are going to keep it easy and use a single mountain geometry node to start our terrain from. As a bonus, I will also explain how you could use real world elevation data to recreate realistic locations.
Terrain doesn't have to be complex, what we are looking for is to create rules of these geological features that we can apply on any terrain. Making it procedural. We will use it as a base for our terrain and from there on we can start adding macro and micro features on top!
A single node to create the base, the rest is driven by the erosion and masks. At any moment you can interchange the base, while keeping all the geological rules. Making it a truly procedural workflow.
Using Real world elevation data, Using map data is not cheating, you are just utilizing resources efficiently and saving time on recreating the same base. You don't need to start from scratch, especially if you value time.
We will need a 2D heightmap for this method. There are multiple ways to get your hands on height elevation data. From NASA or any other space agency or by using websites like Terrain.Party, OSM or Mapbox to get your data. The data can be raw, tiff or png format. I usually use raw data files as the compression of some other formats might give you stepping/banding artifacts in your terrain.
To import your data in WorldMachine or Gaea. Add a "File Node" to the graph and assign the heightmap data that we got to the node. If terrain height and accuracy are important for you to create 1:1 scale terrain, make sure that your settings are setup right, height, pixel density, boundary size etc. Something that has to be mentioned is that Gaea doesn't have these options but WorldMachine and Houdini does, if making terrain on a 1:1 scale is important for you, I recommend using WorldMachine or Houdini.
Tip: if your heightmap shows some spiky artifacts, you can smoothen them out with a blur node set on low strength or by smoothen it out in a sculpting or modeling program like Zbrush, Mudbox and Blender.
Adding ground rules and erosion / signs of wear to make it look more interesting. These rules can also be used later on to create masks for color variation etc.
Now that we have the base terrain imported into Gaea (Or your world editor of choice). We can start adding detail to the terrain to make it a bit more interesting. We can start adding ground rules and erode part of the landscape to create flow lines and deposits.
We can add erosion on top of it to make it look like it got some wear. It will make it look a lot more awesome! Try different kind of erosion combinations. Perhaps even using two erosion nodes after each other to see what kind of effect they have on each other. I sometimes like to combine the eroded terrain output with the pre eroded terrain input on [max] setting. It will give you some interesting shapes.
Tip: If possible use the erosion node at the end of your graph. The erosion node will destroy part of the base geometry. If you want to keep the initial shape of the terrain, you can mask out parts where you don't want the erosion node to take effect.
Get masks from your terrain data that you can use to color your landscape and use for the placement of trees, rocks or other ground rules at specific locations.
Lets color our terrain. You can color your terrain with any datamap or output from some of the other nodes, like erosion or snow node to color your terrain.
This is the graph I setup to texture my terrain. It looks complex but most of it is just combining different masks and subtracting them to create new masks. The purple nodes are color nodes, the orange nodes are the data maps nodes. Next to that I have the combine nodes and I sometimes use the clamps and abs node to control the black and white values of those masks.
It looks complex but it really isn't!
There are many more data map nodes that we can use. We can for example: drive the growth and distribution of other objects on the terrain, like trees, rocks, cliffs and even towns. Combine different data maps to get interesting biomes and distributions. The data maps I use the most are, height, slope, texture, flow, angle. curvature and protrusion. With the Abs and Clamp node, that I mentioned before, allows me to tweak the black and white values of the masks.
You don't need to know all of them, feel free to experiment and see what each of them does.
There are a lot of ways to mask your terrain, based on sunlight, angle, slope, height etc.
Feel free to experiment with all of them to see how they can help you out to make interesting masks.
Time to export it!
With the terrain done, you can now export the files and import them into your engine of choice!
Import your landscape and setup the scene as you like it! I personally like to use Marmoset if it is just to showcase the raw terrain data and use Unreal Engine if I want to create a game ready scene. It should be fairly explanatory.
To export the heightmap, export it using the output node. You can rename the node to be more organized.
Files that we would like to output are the final terrain heightmap, the color map and any other masks that you want to use to drive other textures. When exporting it as a heightmap, make sure that you understand the size that you want to export your terrain. Do you want to make a 2KM^2 terrain and have a pixel density of 0.5 for each meter? Be sure to export your heightmap as 4K to get that pixel density.
If you want to export the terrain as a mesh, you can also consider to export a normal map with it. I often don't like the normal map that's created in Gaea and create my normal map in Blender with use of the displacement map (Heightmap).
Use the Output node for everything in which you want to create a 2D texture map from. You can use the Mesher node if you want to export it as a 3D mesh.
Research, experiment, test, iterate and repeat!
Depending on the game you are creating, the amount of effort you put into the terrain might or might not make a big different in the playing experience for the player. If most of your gameplay is on the terrain, like for example a dirt car racing game, the way how the terrain is shaped can add interesting gameplay moments.
I hope this article gave you some basic insight on how terrain is created for games. It is a nice starting point to learn more about terrain creation, procedural cliff creation, biome creation and other things like all the erosion type and the logic of the way how trees are placed. A small hint, although nature looks chaotic, it shows a defined fractal pattern and follows specific rules.
Trial and Error! Happy terrain creation!