LODs and billboards for low poly models: the complete guide
Low poly does not mean you can skip levels of detail. A three hundred triangle tree is cheap on its own; a forest of two thousand of them is six hundred thousand triangles, most of them a few pixels wide, and the leaves of the far ones are thousands of tiny triangles the GPU has to draw and then throw away. Levels of detail swap a model for a lighter one as it gets further from the camera, and for the far distance swap it for a flat picture.
This guide is the whole subject: what a LOD set is and how engines choose between levels, what counts are reasonable for low poly work, how to make the lower levels so the swap does not show, billboards and impostors for the distance, what LODs do and do not save, and the setup in each engine. The articles underneath go through Unity's LOD Group, billboard trees in Unity, Godot's LODs and visibility ranges and tree colliders in full; one material per tree, which every level of detail wants, is the materials article.
- Unity's LOD Group, set up from separate model filesHow to build a LOD Group in Unity from three separate model files, what the screen-height thresholds mean, the naming convention that makes the importer build the group for you, fade modes, LOD Bias, and how LOD Groups get on with batching and instancing.
- Billboard trees in Unity: the far level of detailWhat a tree billboard is, how to make the picture, the two ways to show one in Unity, a quad with a cutout material or a Billboard Renderer, how terrain trees do it for you, and the settings that keep it from looking flat.
- Levels of detail in Godot 4: automatic mesh LODs and visibility rangesThe two LOD systems in Godot 4, the automatic mesh LODs the importer generates and the visibility ranges you set on nodes, how to control each, fading between levels, and how they work with MultiMesh for a forest.
- Tree colliders in Unity: a capsule on the trunk, not a mesh on the canopyWhy a tree's collider should be a capsule round the trunk and nothing round the canopy, how to set it up on a placed tree and on a terrain tree, what Generate Colliders on the importer does wrong, and the same in Godot and Unreal.
What a level of detail is
A LOD set is the same model at several triangle counts. LOD0 is the full one, LOD1 lighter, LOD2 lighter still, and the engine draws whichever fits the model's size on screen. The swap point is usually a fraction of the screen's height: while the model is taller than, say, a quarter of the screen it is drawn at LOD0, between a quarter and a tenth at LOD1, and so on, until at some size it is culled entirely.
Because the swap happens when the model is already small, the lighter versions can be rough. What matters is that the silhouette and the colours stay the same between levels, so the swap does not show as a pop. A LOD1 that is half the triangles but the same outline is invisible; one that is a different shape draws the eye every time the camera moves.
Reasonable counts for low poly work
| what | LOD0 | LOD1 | LOD2 | far |
|---|---|---|---|---|
| a tree | 300 to 3,000 | about half | a few dozen to a few hundred | billboard |
| a rock or small prop | 16 to 200 | often none needed | none | culled |
| a building | 100 to 1,000 | about half | a box with the roof shape | culled or billboard |
| a character | 1,000 to 5,000 | half | a quarter | culled |
These are for a game that runs on ordinary hardware. A mobile game halves them; a desktop game with a small scene can double them and never notice.
Two things cost more than triangle count and are worth knowing before you make a LOD:
- Draw calls. A model with one material is one draw call however many triangles it has. A model with four materials is four. A forest of trees with four materials each spends more time in draw calls than in triangles, and no LOD fixes that; a palette texture with one material does.
- Overdraw. Foliage made of many separate planes with transparent cutouts draws the same pixels over and over. A canopy that is a closed mesh of solid triangles costs less at any triangle count. When you make LOD1 for a tree, merging the foliage into fewer solid pieces does more good than halving the triangles.
Making the levels
The lower levels should be the same tree, simplified, not a different tree:
- Keep the trunk and main boughs. They are the silhouette and cost little.
- Simplify the foliage. Fewer lumps, or one skin over the crown, at a lower resolution. Keep the colour.
- Drop the twigs at LOD2. Nobody sees them at that size and they are most of the small triangles.
- Keep the pivot and the bounds. The engine measures the model's screen size from its bounds, and if LOD1's bounds differ from LOD0's the swap point jumps.
PolyMason's tree builder makes the levels this way when you tick them at export: LOD1 halves the foliage detail, LOD2 drops the twigs and skins the crown with one coarse mesh, and both keep the trunk, the boughs and the palette, with the exact triangle count of each in the zip's manifest.
Automatic decimation, which every engine and modelling tool offers, works well on smooth organic models and badly on low poly ones, because it removes the facets that are the style. Use it for LOD2 and below if you must, and check the result.
Billboards and impostors
Past the last mesh level, the right level of detail is a picture. A billboard is one quad, or two crossed, with a rendered image of the model on it and transparency around it, turned to face the camera. It is four triangles whatever the model was, and at the distance it is used nobody can tell it from the mesh. Trees are the classic case; a distant forest in most games is billboards.
The image is the model rendered on a transparent background, straight on, and for crossed quads from the side as well. It should be rendered with the same lighting the scene uses, or unlit, since the quad will be lit as a flat surface. PolyMason renders both pictures when you tick billboards and writes the crossed quads that carry them.
An impostor is the same idea with more pictures: the model rendered from many angles into one texture, and the shader picking the nearest angle as the camera moves. Unreal and Unity both have impostor tools; for low poly trees the two-quad billboard is usually enough.
Transitions
A hard swap between levels is a pop, and the eye is good at seeing pops. Engines soften it two ways: cross-fading, where both levels draw for a moment and blend, and dithering, where the outgoing level dissolves into the incoming one over a few frames. Both cost a little; both are worth it for anything the player looks at. For billboards, a cross-fade between the last mesh level and the picture hides the flatness of the quad appearing.
What LODs save, and what they do not
LODs save triangles, and vertex shading, and the fill cost of tiny triangles. They do not save draw calls, which is the other half of the bill: a thousand billboarded trees are still a thousand draw calls unless they are batched or instanced. Every engine has a way to draw many copies of one mesh in one call, and a forest wants it whatever its LODs: Unity's static batching and GPU instancing, Godot's MultiMesh, Unreal's instanced static meshes. The engine articles cover the pairing.
In each engine
Unity holds the levels in a LOD Group component, with screen-height thresholds and a Culled slot. If a model's children are named _LOD0, _LOD1 and _LOD2, the importer builds the group for you. Billboards are a BillboardRenderer, or a quad with a cutout material. The LOD Group article sets it up from separate files, and the billboard article makes the far level.
Godot 4 generates mesh LODs itself on import and picks between them automatically; for control, each level is its own MeshInstance3D with a visibility range, fading between them. The Godot article covers both.
Unreal reduces the mesh itself in the Static Mesh editor's LOD settings, or imports each level as a file, and has hierarchical instancing and impostors for the far end. The Unreal import article shows where the LOD settings are.
Whichever engine, a tree also needs a collider, and it should not be the mesh: the tree colliders article is about that.
The other guides
- Flat shading in Unity for low poly modelsWhy a low poly model goes smooth when it lands in Unity, what the importer's normals and smoothing angle do, the three places to fix it, and how to keep the colours flat too. The complete guide, with the detail in three articles underneath.
- The OBJ file format, explained for game enginesEverything in an OBJ file and its MTL, everything it leaves out (units, axes, colours), how it compares with FBX, GLB and STL, and how Unity, Godot and Unreal each import one without the model arriving tiny, sideways or grey.
- Free low poly assets for GodotWhere to get free low poly models that work in Godot 4, what each source's licence allows, which formats to prefer, how to import an OBJ or GLB with its colours and flat shading intact, how to add a collider, and how to scatter a forest. The complete guide.
Or build a tree and see what comes out.