How to create awesome terrains in Unity

Today I wanna give a short insight on how we gonna create terrains for planet surfaces.
Though Unity has some terrain shaping tools, they are somewhat limited.

We’re using a couple of tools to receive a nice, realistic look.

The basic shape of the terrain is done in Mudbox or any other good sculpting software that can export heightmaps. We will use the heightmap in World Machine, a procedural terrain creation software that will help us add realistic details like erosion.
You can get a free version of World Machine here.

Once we have a nice looking terrain we can export a new heightmap for Unity, a colormap, a splatmap… you name it!
To import our maps in Unity we’ll use the awesome ats Colormap ULTRA terrain shader.

Creating the basic shape

First we need to import a simple plane model into Mudbox. We will use a plane with 512 x 512 units (cm in Maya) and 8 subdivisions as OBJ file.
You can use any 3d modeling software to create that plane or download the plane here.

Working on the details

Open Mudbox!
Before we jump in, let’s set some parameters.

  • Adjust the FOV parameter of the Perspective layer to match the FOV value on your camera in Unity (60 per default). This way you have a better judgement of scale and an equal perspective.
  • Set the Sculpt tool’s direction to Y only. Since the heightmap stores height information, we want polygons to only move upwards in the Y direction.
  • Choose a nice Stamp Image for the Sculpt tool. You can do this after you formed your basic shape. The bw_cliffFace.tif stamp works best for rock surfaces.

Start sculpting your terrain until you’re satisfied with what you got.
When you’re done your terrain could look something like this:

Terrain
Now let’s export a heightmap of our terrain to use in World Machine!
For this we re-import the simple plane OBJ file into the scene to project the high-poly terrain data onto the flat low-poly plane.

After that go to UV & Maps → Extract Texture Maps → New Operation

Select Displacement Map and adjust the following parameters:

  • Target Models (low resolution mesh)  → Add your low-poly plane
  • Source Models (high resolution mesh) → Add your high-poly terrain
  • Search Distance → Try with “Best Guess” and adjust if you get artifacts in the heightmap
  • Image Size → Let’s start with a 2048 x 2048 resolution
  • Base File Name → Select your filename and choose TIFF 16 bit Integer (RGBA)
  • Click Extract to bake your hightmap

export

When the baking process is done you will have a 2048 x 2048 heightmap image.

Adding procedural terrain details

Let’s open World Machine and set up some nodes!
It’s best to set the resolution to a lower value (513 x 513) while fooling around with parameters. This speeds up build-time. Once you’re happy with your terrain you can increase the resolution to 2049 x 2049.
You can change the resolution in the Project Settings menu.
World Machine comes with a lot of presets for every node. Just try out different settings!

Creating a new heightmap

  • First we will need a File Input node from the Generator tab to load our heightmap.
    Double-click the node and choose your TIF heightmap file.
  • You can connect various modification nodes (like Erosion from the Natural tab) to
    the heightfield output of the File Input module
  • Finally connect a Height Output node from the Output tab to the heightfield output of
    the last module from your modificator chain.
  • Double click on the Height Output node and choose a filename.
    Select RAW16 as file format and change the file-extension of the previously selected filename
    from .r16 to .raw
  • Click Write output to disk!

heightmap_settings

Creating a splatmap

A splatmap is used for texturing the terrain depending on it’s height-level.
Therefore we have to split the terrain’s height information into separate channels to get RGBA values. We’ll use the Select Slope and the Select Height module from the Selector tab.

Our nodes could look something like this

splatmap_settings

Slope Selectors can be configured to only select terrain data from a given height range. You get the best results if the Maximum and Minimum values overlap with the other Slope Selectors.

slope_settings

Since the Selectors only have one heightfield output, we have to use a Channel Combiner from the Combiners tab and connect the heightfields to the Red, Green and Blue inputs of the Channel Combiner.
Finally we connect a Bitmap Output node from the Outputs tab to export our splatmap as a 16 bit PNG image.

Creating a normal map

A normal map is great way to add structure to your terrain. To export a normal map we need to add a Normal-Map Maker node from the Converter tab and connect it to a Bitmap Output.

normal_settings

Creating a color map

Finally we need to bake a color map using the Colorizer node from the Converter tab.
To add some more detail we will export a curvature map using the Select Convexity node from the Selector tab.
To export the image files we will need to connect a Height Output and a Bitmap Output node.

settings_full

We will combine the curvature map with the color map using Photoshop. Just fool around with transparency levels and blend modes (overlay seems to work best) until you’re happy with the result.

If you wanna dig further into creating terrains using Mudbox and World Machine, there is a wonderful in-depth tutorial for CryEngine and UDK.
Since the 2nd part deals with importing the maps into CryEngine continue reading – we’ll cover the Unity part in the following chapters!

When you’re done you should have 4 images and a heightmap as RAW data file:

colormapColor Map

curvaturemapCurvature Map

normal_mapNormal Map
splatmapSplat Map

Important: To use the splatmap and the height map with the ats Colormap ULTRA terrain shader, you have to flip them on the Y-axis (use Photoshop or a similar tool)

Importing the Terrain & Maps into Unity

Open up Unity and add your maps to the project.
Additionally add at least 4 textures which you wanna use on your terrain (e.g. grass, rock, …)
We will be using the ats Colormap ULTRA terrain shader which you can get for only 10$ from the Unity Asset Store. It’s worth it!

Create a new terrain with GameObject → Create Other → Terrain.
Go to the Settings tab of your newly created terrain object and set the Heightmap Resolution to 2049 (the size we used to export maps from World Machine) and import your heightmap RAW file by clicking the “Import Raw” button.
terrain_settings
 Warning: You have to choose “Windows” as the Byte Order in case it’s set to “Mac”! Otherwise your terrain will be totally messed up.

heightmap_import

 

Using the ats Colormap ULTRA terrain shader

Setting up the ats Colormap shader is a bit complicated, but the documentation which is contained in the package is really good.
The best way to get your terrain up and running is to follow the steps from the manual.

Anyway, here’s a quick overview of how to set up the shader:

  • Add at least 4 terrain textures to the terrain’s paint tool
    add_textures
  • Add the “CustomTerrainScriptColorMapUltraU4.cs”-script (when using Unity 4) to your terrain.
  • Assign your colormap and the normalmap using the new editor that appeared on the terrain
    when you added the Colormap script.
    add_colormap
  • Add your splatmap and hit “Apply Splat Map”
    In case you have troubles with the splatmap’s format, you can change it the import settings
    of the image file in Unity.
    add_splatmap
  • Create combined normalmaps by adding your terrain texture’s normal maps to the slots
    and export the newly combined normalmaps
    combine_normals
  • Generate average colors for seamless blending for each texture
    avg_color
  • Create a new terrain material
    create_material

Now you should have an awesome terrain in Unity!
If you encounter any problems with ats Colormap ULTRA terrain shader please check the user manual that’s included in the package. It’s really detailed and you should be able to solve any issues.

Here’s the terrain we’ve just created:

terrain_final

If you have any comments or suggestions please leave us a comment below or get in touch via Twitter!

Gerald Soelkner

About Gerald Soelkner

Environment Design at BitsAlive Follow us on Twitter: @bitsalive

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Current month ye@r day *

Post Navigation