Hey everyone. For a long time I’ve been struggling to figure out when to post here. Ultimately two months into development I came to the conclusion it’s a good time to start.
What am I working on?
A little over two months ago I was trying to figure out a fast and efficient way to create fake drone shots and backdrops for my renders that can reach to the horizon.
Most terrain generators mainly focus on single mountains or ridges as a hero object which objectively doesn’t work well for large scale environments.
After experimenting with voronoi and noise displacement it became clear that those won’t suffice, which had me think about what the biggest terrain shaping force in nature could be. Which obviously are rivers, water and erosion in general. So I thought making a believable river system is the key to a believable landscape.
Chapter 1: A shader prototype
Because I’m much more fluent in shader nodes than geometry nodes I’ve decided to create a first prototype here. I figured out a method to visually connect two points which gave me the foundation to create a fractal branching system. Since each new point would essentially create a new local space, I could easily create a forth setting tree system, always connecting the 0,0 point with a through white noise generated second point. With the help of mesh displacement and some noise this already made for an interesting landscape.
Chapter 2: First steps in GeometryNodes
The biggest challenge was now to translate the whole thing to geometry nodes, which works almost entirely different than shaders.
Regardless I decided to try a similar approach. I would spawn a point with a direction vector. With each iteration of a repeat zone I would first determine if the point would stay single or duplicate and then randomly rotate the initial direction vector and displace the point along the vector before merging with the original point.
The biggest challenge was to keep the IDs in order so they would connect correctly later on. I decided to always differentiate into main branch and side branch. The main branch would always keep the initial ID while the side branch receives a new one. The goal was to make sure I wouldn’t run out of IDs too fast.
Chapter 3: A first environment
From this river system I now had to create a terrain around it. The easiest way was to create a grid mesh and use the geometry proximity value to displace it upwards.
In a first try I created a basic terrain texture with voronoi cell divided and random rotated fields using wave textures. With through geometry nodes scattered textured points which I used as trees.
[
]https://youtube.com/shorts/S13oArHmB7s?feature=share
Chapter 4: Displacement rework
Because I was a bit dissatisfied with the initial simple displacement, I decided to refine it a little bit
I decided to go with a method I’d call stacked elevation. I’d take the distance to the first iteration of branches, then combine it with the distance of the second iterations, then third, fourth and so on. At the end I divide everything by the total number of iterations and get a weighted average where the early branches have more impact on the elevation, which prevents every branch to stay completely flat.
Chapter 5: New procedural texture
Now it was time to completely start over with the texture. I decided to go entirely procedural with shader nodes. Including trees and other props, staying limited to exactly one grid mesh and the river water.
I started first attempt with voronoi cells. The first major cell cluster distinguishes forest cells and open air cells.
The forest texture is essentially three bubbly voronoi textures stacked on top of each other. The color value allowed me to randomize each tree a little bit and adding a noise texture to the position output I was able to create clusters of leaf trees and conifers, giving the forest some variance.
https://youtube.com/shorts/4nSJYofTJ4Y?feature=share
The open air cell once again was divided into meadow and field cells. The texture of which were all based on wave textures, with the difference of the meadow texture having a bit less contrast.
The fields I then divided by the voronoi color into two states at first: grown and harvested.
Between each cell I’ve added roads using the Distance to Edge mode. I would randomly turn the path on and off which created larger connected areas.
Additionally, I’ve added some tree lines along those paths which looked kinda nice as well.
Later on I would also add a differentiation between growing and ripe fields, as well as orchards.
Chapter 6: Integration with the terrain
After doing some dry practices with the texture on a simple plane, it was time to work on an integration with the terrain generator I made in geometry nodes earlier. And the result was honestly extremely stunning from the beginning.
First ways to utilize the terrain from geometry nodes were the transfer of the height attributes, distance to river, as well as normals, which would stay unaltered, unlike the normals in the shader node system, when using actual material displacement instead of bump.
This allowed me to add rock surfaces on the sides as well as a proper river bed. Also I would default to forests on steeper slopes, as agriculture is not an option there.
Chapter 7: Iterating
From here on I kept on iterating and improving. For instance I started adding buildings. Even though they were simple and limited by the resolution of the mesh, they did add a bit of human presence that actually elevated the overall look a lot.
I kept refinig the river banks and mounatins, some shots even made me feel like it could be from Heidi. Though only from a distance.
Chapter 8: Preparing for outside use
Up until this point, there have been no exposed variables and input to the node group I was working on. So I started to add controls for easy use, in case I would ever decide to sell it.
Here a little showcase of the versatility:
At this point I started noticing something. We’ll come back to it later.
Chapter 9: More improvements
- Improved rock surfaces
- tried to add a secondary water system
- and lakes
- it worked semi well
Also something I havent mentioned before. I am using a custom geometry node setup to control additional subdivisions based on distance and the cameras frustum. Here a little demonstration how well its working:
It was at this point I got stuck. The world looked like a colorful carpet. I realized everything was too bright and saturated and decided to completely rework the textures.
Chapter 10: New textures
Now first of all I started with the fields. They received a new age system which gradually adds yellow to the crops with age, the texture itself is more detailed now, less saturated and the paths in between now have a proper dedicated texture:
Orchards have been reworked completely as well. I’ve added alternating grass and dirt lines in varying sizes as well as new, more detailed tree textures. And I adapted the paths I used for the fields
Next I started working on the new forests, the trees now have alternating sizes and would even feature more open and lighter areas. I added a dedicated ground texture to the forest and “some” tree stumps. Also it received its dedicated path type.
Chapter 11: Reintegration and Terrain improvements
Being done with the first three major texture improvements, I decided to reintegrate them into the old shader, replacing the redundant shader pieces.
Also the distance test looks better than before:
After some testing I realized I am missing something. I decided to add a little bit stepping to the terrain generator, which would create random banks along the hills and mountains, providing flat space for settlements, fields and the likes.
This was the second time I genuinely felt like I am going the right direction and it started looking so extremely real.
Especially the consistency between seeds made me feel extremely happy. These renderings are all from the same location in single increments. (So 1,2,3,4,…)
Chapter 12: More improvements and future
Most recently I’ve added meadows and pastures. Pastures of stonewalls like its common in the UK, simply because fences wont work with the method I am using. For the grass and meadows I am using a certain technique to technically create tons of individual flat grass pieces. Obviously at a little larger scale to its easier to see from further away.
My future plans are currently to
- rework and add the buildings villages and towns again
- rework roads and streets. I am planning to add tunnels and proper intersections
- a fake traffic system. (It can work, I tried)
- improve the rock surfaces, they can be more realistic
- improve the river material.
- secondary water system with lakes and small streams.





































































