Foliage and vegetation
How games build and draw trees, bushes and grass; alpha cards versus modelled leaves, instancing, culling and billboards in Unreal, Unity and Godot, the costs of wind animation, and what Fortnite, Ghost of Tsushima and Horizon Zero Dawn did.
Foliage is the umbrella term for the plants in a game world: trees, bushes, grass, flowers and ground cover. It is one of the more difficult parts of a scene to optimise. A forest means thousands of copies of a few assets, leaves full of holes and gaps, and wind moving everything at once. Epic's documentation notes: "High densities of foliage can cause performance issues" (Unreal Engine Documentation: Foliage Mode).
Good vegetation work is half art (shape, colour, believable growth) and half technical discipline (how many, how far, how expensive). This page is about the second half and how it shapes the first. For placing plants by rules instead of by hand, see procedural placement and scattering; for the ground they grow on, see terrain and landscapes; for tree-generating software, see vegetation and procedural tools.
#Layers of vegetation
Think of vegetation in layers, because each one is built and drawn differently.
| Layer | Typical examples | How it is usually drawn |
|---|---|---|
| Hero trees | The oak by the quest giver | Full-detail mesh, close LODs, placed by hand |
| Forest trees | Thousands of pines | Instanced meshes, LODs, impostors and billboards far away |
| Bushes and shrubs | Undergrowth | Instanced meshes, short cull distance |
| Grass and ground cover | Grass, ferns, flowers | Instanced or GPU-generated, culled within tens of metres |
| Debris | Twigs, leaves, pebbles | Decals or tiny instances, very short cull distance |
#Cards and modelled geometry
Classic game foliage uses cards: flat quads textured with a photo or bake of leaves, with an alpha mask cutting out the leaf shapes. Cards are cheap in triangles but expensive in pixels, because the transparent parts of the quad still cost shading and overdraw (Unreal Engine tech blog: Bringing Nanite to Fortnite Battle Royale in…). Overlapping cards in a bush shade the same screen pixels many times. See opacity, masked and translucent materials and overdraw.
Nanite changes this balance. On Fortnite, Epic found that "masked materials in Nanite incur a significant cost during base pass shading" and that "negative space in the alpha maps adds additional overdraw cost", so "it was usually faster to avoid masked materials and instead rely on increasing triangle counts of the mesh" (Unreal Engine tech blog: Bringing Nanite to Fortnite Battle Royale in…). Its Nanite trees had about 300,000 to 500,000 vertices, against 10,000 to 20,000 for the non-Nanite versions (Unreal Engine tech blog: Bringing Nanite to Fortnite Battle Royale in…). See virtualised geometry.
Simplification has a side effect on leaves: Fortnite's trees "would lose their canopies in the distance". Epic's fix, Preserve Area, spreads the lost area over the remaining triangles, and Epic advises enabling it only on foliage that shows the problem (Unreal Engine tech blog: Bringing Nanite to Fortnite Battle Royale in…).
#Instancing and culling
Foliage depends on instancing: drawing many copies of one mesh in a single call.
- Unreal. Meshes placed with Foliage Mode "are automatically grouped together into batches that are rendered using hardware instancing" (Unreal Engine Documentation: Foliage Mode). Instances are culled beyond an End Cull Distance and can fade out before that with a material node (Unreal Engine Documentation: Foliage Mode). Note that "the entire cluster of instances change LODs simultaneously" (Unreal Engine Documentation: Foliage Mode). With World Partition, the default foliage grid is 256 m (Unreal Engine Documentation: Foliage Mode).
- Unity. Terrain trees and details are drawn up to Tree Distance and Detail Distance, in metres, and a Detail Density Scale thins them globally (Unity Manual: Terrain settings reference).
- Godot. A MultiMesh "can draw up to millions of objects in one go", but "there is no screen or frustum culling possible for individual instances", so visibility is all or nothing (Godot Engine documentation: Optimization using MultiMeshes). Split large fields into chunks so off-screen chunks can be culled.
#Costs of wind animation
Most foliage moves with World Position Offset (WPO), a material that shifts vertices every frame. It affects almost every other system.
- Shadows. In Unreal, WPO geometry "always invalidates cached pages every frame" in virtual shadow maps (Unreal Engine Documentation: Virtual Shadow Maps). See shadows and virtual shadow maps.
- Global illumination. Lumen's software ray tracing does not support WPO (Unreal Engine Documentation: Lumen Technical Details).
- Nanite. Fortnite replaced "complex logic driving World Position Offset" with wind baked into a texture, so each vertex only looks up "a single position and quaternion", but this "only supports rigid animation" (Unreal Engine tech blog: Bringing Nanite to Fortnite Battle Royale in…). The team also turned wind off at distance, because it is "fairly indistinguishable out in the distance" (Unreal Engine tech blog: Bringing Nanite to Fortnite Battle Royale in…).
The same approach works in any engine: animate what the player is close to, and freeze or simplify the rest.
#Lighting foliage
Foliage is thin, layered and full of holes, which confuses lighting systems built for solid walls.
- In Unreal, foliage needs Affect Distance Field Lighting enabled to appear in Lumen, and foliage and instanced meshes are only supported in the Lumen scene if they use Nanite (Unreal Engine Documentation: Lumen Technical Details).
- Fortnite hit "severe over-occlusion on foliage meshes" and grass aliasing in Lumen's screen traces; skipping reflection rays on foliage saved 1 to 2 ms (Unreal Engine tech blog: Lumen brings real-time global illumination to…).
- Godot's Terrain3D includes a "shadow impostor" for distant foliage (GitHub: Terrain3D).
#In different engines and tools
| Unreal Engine 5 | Unity 6 | Godot 4 | |
|---|---|---|---|
| Placement | Foliage Mode: Paint, Erase, Fill, Lasso, Single (Unreal Engine Documentation); PCG (see procedural placement and scattering) | Terrain trees and details (Unity Manual) | MultiMesh (Godot Engine documentation); Terrain3D foliage instancing (GitHub) |
| Distance control | End and Start Cull Distance (Unreal Engine Documentation) | Tree Distance, Billboard Start, Detail Distance (Unity Manual) | Per MultiMesh, all or nothing (Godot Engine documentation); Terrain3D LODs (GitHub) |
| Far trees | Nanite or LODs and impostors | Billboards (Unity Manual) | Impostors (Terrain3D shadow impostor) (GitHub) |
| Scalability | foliage.DensityScale (Unreal Engine Documentation) |
Detail Density Scale (Unity Manual) | Chunking by hand |
Tree generators such as SpeedTree, The Grove and Unreal's Procedural Vegetation Editor are compared in vegetation and procedural tools.
#Common mistakes
- Loose card shapes. Large transparent margins on cards waste pixels (Unreal Engine tech blog: Bringing Nanite to Fortnite Battle Royale in…).
- Wind on everything at every distance. It breaks shadow caching and costs time far away (Unreal Engine Documentation: Virtual Shadow Maps; Unreal Engine tech blog: Bringing Nanite to Fortnite Battle Royale in…).
- One giant MultiMesh in Godot. It cannot be partly culled (Godot Engine documentation: Optimization using MultiMeshes).
- Grass drawn too far. Each extra metre of detail distance adds instances by the square.
- Forgetting Lumen settings on foliage. Missing foliage in GI looks like floating, unlit plants (Unreal Engine Documentation: Lumen Technical Details).
#Further reading and watching
References
- · Foliage Mode · Unreal Engine Documentation, 2026 · docs · accessed 2026-10-21
- · Bringing Nanite to Fortnite Battle Royale in Chapter 4 · Unreal Engine tech blog · article · accessed 2026-10-21
- · Terrain settings reference · Unity Manual, 2026 · docs · accessed 2026-10-21
- · Terrain3D (README) · GitHub, 2026 · tool · accessed 2026-10-21
- · Assassin's Creed Shadows : Foliage · ArtStation · web · accessed 2026-10-21
- · Optimization using MultiMeshes · Godot Engine documentation (source on GitHub), 2026 · docs · accessed 2026-10-21
- · Advanced Graphics Summit: Procedural Grass in 'Ghost of Tsushima' · GDC 2021, 2021 · talk · accessed 2026-10-21
- · Virtual Shadow Maps · Unreal Engine Documentation, 2026 · docs · accessed 2026-10-21
- · Lumen Technical Details · Unreal Engine Documentation, 2026 · docs · accessed 2026-10-21
- · Lumen brings real-time global illumination to Fortnite Battle Royale Chapter 4 · Unreal Engine tech blog, 2022 · article · accessed 2026-10-21
- · The Procedural Nature of the Horizon Zero Dawn · 80 Level, 2017 · article · accessed 2026-10-21
- · Artstation Learning - Environment Production in UE5 · ArtStation · web · accessed 2026-10-21
- · Vegetation and Plants for Games With Jared Sobotta · YouTube, 2022 · video · accessed 2026-10-21
Pages that link here
- Roles in 3D game production Topic
- Winding order and backface culling Key term
- Manifold and non-manifold geometry Key term
- Modeling software Reference
- Vegetation and procedural tools Reference
- Asset libraries and asset licences Reference
- Composition Topic
- Light and shadow Topic
- Kitbashing Topic
- Hero assets, props and filler Topic
- Modeling rocks, trees and terrain pieces Topic
- Polygon and triangle budgets Topic
- Level of detail (LOD) Topic
- Impostors and billboards Key term
- Instancing Key term
- Retopology Topic
- Mipmaps Key term
- Opacity, masked and translucent materials Key term
- Breaking up tiling Topic
- Shaders for artists Topic
- Master materials and instances Topic
- Mesh distance fields Key term
- Shadows and virtual shadow maps Key term
- Colour grading and LUTs Key term
- Terrain and landscapes Topic
- Wind and world position offset Key term
- Procedural placement and scattering Topic
- Poisson disk sampling Key term
- Virtualised geometry (Nanite) Topic
- Level design and environment art Overview
- Blockout (greyboxing) Topic
- Set dressing and art passes Topic
- Performance and profiling Topic
- The technical artist Topic
- Overdraw Key term
- Demo reels and flythroughs Guide
- Exercise: a modular room Exercise
- A 12-month learning roadmap Guide
- Learning platforms and courses Reference
- Essential talks and videos Reference
- Game art breakdowns: a curated library Reference
Last updated 2026-10-22