Making a 3D Landscape in Godot (Part 1)

This is a multi-day process, this post is the 1st day. Check out the other posts for more.

Side note: I bolded text in paragraphs to signify new stuff I learned or which others can take take away

What it had

  • Water lake
  • Sand surrounding water
  • Plains
  • Snowcapped mountains





Making it

1 - Making the raw landscape

  • Making base landscape

This wasn't too hard; I first resized it to a size of 127 (instead of the deafult ~500 odd which I knew was way too big) and then set the base height and height range to 0, thus making a flat plane at a Y value of 0. This simplified stuff and let me easily play around with different mountain formations. If I messed up, I could always just flatten the landscape to a value fo 0.

  • Mountain

I had quite a bit of trouble with this, all the stuff I was making ended up being really jaggy.
I tried making it using different brushes, but that didn't help. That made more of volcano-like formations instead of normal mountains.

I figured out that to make smooth, rounded mountains, you have to increase the brush size and decrease the opacity.

That will ensure that your brush will cover a large part whilst not making it jagged.

One thing you can do is have a higher opacity initially to get some height, and then lower the opacity and choose a few peaks to develop.

2 - Painting the landscape
First, I discovered that the plugin I'm using only supports painting with 4 textures, which sucks. Thus I was limited to using:

  • sand
  • stony grass
  • stony snow, and
  • snow

One of the first problems I noticed was that the textures were very stretched and looked ugly on the cliffs. Generally, using 3D models is recommended for cliffs but I haven't reached that point yet. Fortunately, there is an easy fix to that situation. I just turned on "U Triplanar" in the Shader Params on the HTerrain node, and it already looked a lot better.

Then, I moved to painting the corner of the landscape with the water (added later) with sand, the cliffs with snow and stony snow, and the rest had stony grass applied to it. Now, there was some character developing.

The plugin supports blending between two materials based on their opacity, so I made sure to use that when mixing the stony show on the edges of the mountains with the stony grass on the rest of the map. I also blended the snow with the sand. It's not perfect, but also not too bad for a 2 hour job

For the sand, I remember a particular place in AC: Origins where the sand blended in with the rest of the landscape by having a few jagged spots on the edge, instead of being completely smooth. I made sure to add that, and it definitely helped.

But at this point, I noticed another issue - the textures were tiled, and it was really easy to see the repeating pattern. Obviously, this breaks the immersion and looks really lame so I needed to fix it. Luckily, there was a pretty simple way to do so: I simply turned up the U Ground Uv Scale property of the HTerrain node to 50 from 20. This scattered out the tiles a lot more and gave it a better look.

By this point, it had been a few hours but I wanted to add water (which until now was just painted blue) and fix the lighting in the scene.

3 - Adding water

This one was kind of tricky. I didn't know how to code some water, but I knew there were readily available shaders I could use from online. I used the realistic water shader I linked at the starting of this article, but ran into a couple of issues with that.

After downloading the zip and moving just the water scene into my project, I ran into multiple dependency issues - naturally. I copied over the required files, but the location to the dependencies were still outdated so I had to fix them. That was pretty straightforward.. until it came to the .material file.

The water.material file failed to load because it couldn't find a couple of files, but I couldn't find a way to fix it. Opening the .material file in Godot showed an empty file with errors, so I knew something was very off. Eventually, after 10 minutes of right clicking on everything, I figured it out. To change the dependencies of a .material file, you have to right click on it and press Edit Dependencies. I don't really know why it's hidden away there, but regardless, it was fixed.

Now that I had water working, though, I had to get it to fit the shape I wanted. This proved more difficult than I imagined. By default, the water node had a Plane Mesh, and I thought it'd be easy - I just change it to a polygon mesh, make a quick triangle, and there you go. Unfortunately, there is no in-built polygon mesh, and I didn't want to model something (I'm not the best at modeling). I decided as a workaround, I would just make a Cylinder Mesh and increase the radius and have a circle-shaped lake.

I increased the radii to 30, and height to 2.5, but now it sat awkwardly over the land, and it looked extremely weird from the side. I tried to move it down and keep a part of it under the land itself, hoping it'd look better, but then I had a wafer-thin layer of water over the land, which didn't look great.

Then, I decided to depress the land itself, and make a lakebed of sorts. I used the flatten tool to change the height to -1, and I discovered something pretty neat: the water shader I was using reacted to the collision shape of the landscape and appropriately made foam effects. Also, the water shader I'm using automatically drew stones under the water which made for a very very nice effect.
By making a lakebed and putting the water in it, it made a very appealing lake with pebbles at the bottom, water which lightened as it hit the shore and met sand.

4 - Lighting

This one only took a bit. I added a directional light, changed the color a bit to be more yellow, and messed with the rotation degrees to hit the scene as I liked. Looked a lot better after that.

How to Improve

There are a couple of stuff I know I can add or change to improve it drastically:

  1. Adding details like grass, stones on the shore, flowers, etc. There is a godot plugin called Scatter which was recently featured on GameFromScratch's youtube channel, which I want to give a shot. It seems pretty capable and would definitely help the scene.

  2. Adding some 3D assets. Making a pretty terrain is nice, but 3D models really help make it pop - so stuff like cliffs, rocks, etc. Quixel Megascans has no shortage of those, and I'm excited to play with them and see how good I can make the scene look.

You'll only receive email when 13500 publishes a new post

More fromĀ 13500