Last month, we talked about how Rustclad will play out over a series of islands in a watery world. This time, we wanted to share a bit more about the technology behind our terrain.
There are a few ways that you can render terrain. The tried and true method is to use a ‘height map’. This is a 2D top-down view of the terrain, with each value in the map representing the height of the ground at that position. It looks a little something like this:
It’s a pretty popular method of rendering terrain, and has the benefit of being easy to implement and fast to render. However, it’s limited in that the terrain at a given point can only ever be raised and lowered, and you can only ever represent the space above the terrain, and not underneath it. Also, it’s hard to represent extreme vertical surfaces like cliff faces with a height map. There are other ways of constructing terrain which are much more robust, such as vector fields (which replace the ‘height’ value at each point on the map with a displacement vector, and allow for overhangs the the like) and voxels, which represent the terrain as a 3D cloud of points, and easily support subterranean structures like caves and underground chambers.
However, these methods introduce a lot of complexity to the terrain system. And realistically, most games play out on top of the terrain and not within it, so height maps are still a popular method of representing terrain, even today. We’re also a fan of height maps because of their simplicity, but we didn’t want the beauty of Rustclad to be hindered by the limitations of the technique. So in short, we use height maps in Rustclad, but we have a few enhancements to expand their usefulness even more.
As mentioned above, one significant limitation of height maps is that they don’t represent sheer vertical structures very well. This has to do with the fact that all of the information in a height map is evenly distributed across the length and width of your space, but not along the height. Because of this, extreme height variations become underrepresented. This is most evident when texturing. Steep cliffs take on a streaky, smeared appearance as the texture is stretched along the vertical faces of the terrain. One way to help with this is to use something called a ‘triplanar projection’ when texturing terrain. What this basically means is that you texture the terrain three times from three different directions, and then you pick whatever ends up looking best. It’s not a new technique by any means, but it’s a very effective way of improving the look of height map terrain. Here’s a shot of our terrain first without triplanar projections, and then with. Note how much better the sheer vertical faces look in the second image.
The other major limitation of height maps is that terrain can only ever be raised or lowered, and never jut out and overhang. You can never look up and see the terrain above you. This is normally not a huge deal, but we want our world to look truly alien, and our landscapes to be stunning and bizarre. The phrase ‘impossible geometry’ has come up more than once in design discussions about our world. So in short, height maps alone aren’t going to cut it for us.
To really stretch our terrain to its limits, we’ve adopted a technique of integrating and blending objects into the terrain. These ‘terrain objects’ are inserted into the height map and appear as if they were simply an extension of the terrain, but allow us to do things that a height map is unable to do. We’ve also rigged them up to our dynamic deformation system, which allows us to bend and shape the pieces to create uniqueness in the geometry and get a lot of re-use out of our terrain objects. And like everything else in the game, these objects are captured and digitized from physical objects that we’ve collected, so the terrain in Rustclad will literally be constructed from pieces of our own backyard.
With these tools, it’s quite fast for us to throw together some pretty unique terrain. It lets us take advantage of the simplicity and speed of height mapping without making any visual sacrifices in the process. Below is a textured section of our heightmap-based terrain, without any terrain object enhancements:
And now this is the same piece of terrain, with added terrain objects:
And finally, this is the scene again with additional deformable terrain objects, which enhance the other-worldly look that we’re trying to achieve.
These deformable objects are quite versatile. By quickly manipulating a few control points, they can be changed dramatically. This is the same scene, after less than a minute of tweaking to the deformable objects. Note how different the terrain looks after just a little bit of work.
And here’s another scene, without terrain objects:
And then with.
There’s so much more to be done to these scenes to bring them to life, but our terrain system lets us build a really solid foundation to work on top of.