It’s been a while since our last blog post, but it’s only because we’ve been hard at work, we swear! We haven’t even thought about rushing off to the Bahamas with your hard-earned money!

This time I’m going to shed a little light on a little something that makes it possible to render massive and densely populated worlds in real time: impostors.

To put it simply, an impostor is a flat polygon that looks like a more complex piece of geometry. They are often used as the last step in a set of levels of detail for an object. To make them look as convincing as possible, the textures applied to impostor polygons are usually rendered by the 3D engine rather than being created by artists. Reset has a deferred renderer so this is particularly simple: we just render a mesh into a tiny G-buffer and then use a special shader to splat copies of it onto the main G-buffer.

Sometimes impostor textures are updated dynamically based on the exact point of view. This is a fairly complicated system for a small team to develop, so we just render a fixed number of viewing angles for each mesh as a preprocessing step. At runtime all the data is available statically which makes rendering the impostors into the scene extremely simple and efficient. Transitions between meshes and impostors (as well as between meshes of different levels of detail) are handled with dithered cross-fading so there is no popping.

The island has about 100000 trees in total. In this particular view you can see a bunch of high detail tree meshes in the foreground as well as about 38000 tree impostors in the distance.

As development progresses the island will get populated by an increasing number of other objects and we will be able to use this system for them as well.