All articles
Tutorials · 6 min read

Dense forests without the framerate cliff: LODs, impostors and instancing

How to render thousands of trees at framerate: the LOD chain from full mesh to billboard, octahedral impostors that hold up from any angle, instancing and culling, and the wind and shading tricks that keep a baked forest from looking dead.

Spruce forest on a green alpine slope with a handful of wooden cabins below

In short: A convincing dense forest needs a disciplined LOD chain, instancing, culling, and impostors for distant trees. The goal is not merely fewer triangles: layered transparency, shadows, and thousands of visible instances must all become cheaper with distance while shading and variation keep the optimized forest from looking flat or obviously repeated.

The edge of a forest, trees receding into depth Every tree here is a different distance from the camera, so every tree should be a different cost. The art of a cheap forest is spending polygons only on the ones up close and faking the rest convincingly.

The core idea: pay per distance

A tree 5 metres away and one 500 metres away should not cost the same. A LOD chain spends full detail up close and progressively cheaper representations with distance, ending in a flat billboard, so total cost stays flat as the forest grows.

The whole game is refusing to pay full price for trees the camera barely resolves. Up close, a tree is a full mesh with individual leaf cards; far away, it's a handful of pixels that a flat image reproduces perfectly. A LOD (level-of-detail) chain formalizes that: several versions of the same tree at decreasing cost, swapped by screen size, so a forest of ten thousand trees costs roughly what's visible in detail rather than the sum of every tree at full quality. Without it, density scales your frame time linearly into the ground; with it, you can push the tree count far higher for the same budget.

The LOD chain, step by step

LOD0 is the full mesh with leaf cards (close); LOD1–2 reduced geometry and simplified leaves (mid); LOD3 a few cards or a single card; final LOD an impostor/billboard (far). Each step roughly halves cost while the swap stays invisible.

A typical foliage LOD chain runs something like: LOD0, the full-detail mesh with all its leaf cards, for trees right next to the player; LOD1–LOD2, reduced trunk geometry and fewer, larger leaf cards, for the mid-ground; LOD3, a drastically simplified card cluster; and a final impostor, essentially a flat image, for everything distant. The craft is in the transition distances and blend, so the swap doesn't pop. Dithered or cross-faded LOD transitions hide the switch; a hard pop at the wrong distance is the tell that breaks the illusion. Tune the distances against your actual camera, not defaults.

Impostors: faking 3D from any angle

An impostor (octahedral impostor) pre-renders the tree from dozens of angles into an atlas, then shows the nearest captured view as a billboard. Unlike a flat billboard, it looks correct as the camera moves around it: cheap, but 3D-ish.

The far end of the chain is where the biggest savings live, and the impostor is the clever trick that makes them acceptable. A plain billboard, one flat image that turns to face the camera, looks fine dead-on but flattens and slides unnaturally as you move. An octahedral impostor solves this by pre-rendering the tree from many viewpoints arranged around a sphere, packing them into a texture atlas, and displaying whichever captured angle is closest to the current camera direction (blending between the nearest few). The result reads as a real 3D tree from any angle at a fraction of the cost, which is why impostors are the backbone of believable distant forests. They're baked once and cost almost nothing to draw.

Ferns and low undergrowth carpeting a forest floor The ground layer multiplies the instance count fast. Undergrowth needs the same discipline as the trees: instance it, LOD it, and cull it hard, since a fern at 80 metres should not be drawing at all.

Instancing and culling

Draw repeated trees as instances so thousands cost few draw calls, and cull aggressively: frustum-cull what's off-screen and distance-cull the small stuff. Instancing fixes CPU cost; culling stops you paying for the invisible.

Even with perfect LODs, submitting ten thousand trees as individual objects buries the CPU. Instancing collapses all copies of a tree into a handful of draw calls, which is non-negotiable for a real forest, and it's exactly what baking a scatter to native engine instances gives you. On top of that, cull ruthlessly: frustum culling drops anything outside the view, and distance culling removes the ground clutter and small foliage that's too tiny to notice past a certain range. Grass and undergrowth especially should have hard, near cull distances, because they multiply the instance count faster than trees do. A workflow that paints density and then bakes to instanced meshes, like Numivo's, hands the engine exactly the batched, cullable form a dense forest needs.

Keeping the cheap forest alive

Heavy optimization can make a forest look static and dead. Counter it with subtle wind on the near LODs, colour and scale variation between instances, and shading that keeps distant impostors from reading as flat cardboard.

The risk of all this efficiency is a forest that runs great and feels lifeless. Three cheap touches bring it back: wind, vertex animation on the near LODs so close foliage moves, even if the distant impostors stay still (nobody notices a static tree 300 metres away); variation, randomizing scale, rotation and a tint per instance so the eye doesn't catch the repeat, since identical trees are the copy-paste tell; and shading care on impostors, baking their lighting so they don't flatten into obvious cardboard when the sun angle changes. Spend the frame time you saved on these details up close, where the player actually looks, and the optimized forest feels every bit as alive as an unoptimized one, while running several times faster.

Field numbers worth stealing

  • Cost principle: pay per distance (a far tree must not cost like a near one)
  • LOD chain: full mesh → reduced → card cluster → impostor, each ~halving cost
  • Impostor = pre-rendered angles in an atlas → 3D-ish billboard from any view
  • Instance repeats (few draw calls) + hard-cull small distant foliage
  • Keep it alive: near-LOD wind + per-instance variation + baked impostor shading

Mini-FAQ

Billboard vs impostor: what's the difference? A billboard is one flat image that faces the camera and flattens as you move around it. An impostor stores many angles and shows the right one, so it holds up in 3D. For anything the player orbits or passes, use impostors; plain billboards are fine only for truly distant, static backdrops.

How many LOD levels does a tree need? Commonly three to four plus an impostor. More isn't automatically better, since each level is authoring and memory cost. Enough to make each swap a small, unnoticeable step is the target, not a maximum.

Does Nanite make this obsolete? It changes the geometry side: Nanite handles dense mesh detail without traditional LODs, but transparency (leaf cards), instancing discipline and culling still matter, and impostors remain useful for the far distance. The principles survive; the tooling shifts.

What kills forest performance most often? Overdraw from overlapping transparent leaf cards, and un-culled ground foliage. Tighten the leaf cards, cull undergrowth near, and instance everything: that trio reclaims most of the budget before you even touch the tree meshes.

A dense forest is one of the most punishing things to render and one of the most rewarding to get right. Build the LOD chain, let impostors carry the distance, instance and cull without mercy, and spend your savings on wind and variation up close, and you'll have a forest that stretches to the horizon and holds its framerate.