The 3D Handbook
Key term

Frustum and occlusion culling

Skipping objects the camera cannot see (outside the view, hidden behind other geometry, too far away or known to be invisible from a precomputed cell) before they cost draw calls; how Unreal and Unity do it and how artists can help.

optimisationengineperformancemodular

Culling means deciding, before drawing, which objects cannot be seen and skipping them. Epic lists four methods in Unreal (distance, view frustum, precomputed visibility and dynamic occlusion), and says "each method works to reduce the number of visible Actors in the Level" (Unreal Engine documentation: Visibility and Occlusion Culling in Unreal…).

Culling happens per object, using each object's bounds rather than its triangles (Unreal Engine documentation: Visibility and Occlusion Culling in Unreal…). That is why the way artists split and size meshes affects how well it works.

#Four kinds of culling

Top-down view of a camera with a triangular view frustum. A grey box inside the frustum is labelled drawn. A dashed orange box above the frustum is labelled frustum culled. Behind a dark wall, a dashed orange box is labelled occlusion culled. A dashed orange arc marks the cull distance, and a small dashed box beyond it is labelled distance culled.
Only the grey object reaches the GPU. The others are skipped for different reasons: outside the view, hidden behind the wall, or beyond the distance set for their size.Diagram by the handbook author
A first-person view of a plain blue-grey interior. A wall fills the left half of the frame; through a doorway on the right, a lit room leads to a long row of further doorways.
A test scene built for occlusion culling: hundreds of rooms stacked next to each other, with a dynamic red sphere hidden behind the wall on the left of the door. Screenshot from Godot.Godot Engine documentation (Juan Linietsky, Ariel Manzur and the Godot community), CC BY 3.0
Wireframe view of the same scene with occlusion culling disabled. Edges of many rooms behind the visible one show through, and the red sphere behind the wall is drawn.
Occlusion culling disabled (wireframe): every room behind the lit one is rendered, and so is the hidden red sphere. Screenshot from Godot.Godot Engine documentation (Juan Linietsky, Ariel Manzur and the Godot community), CC BY 3.0
The same wireframe view with occlusion culling enabled. The red sphere is gone and fewer room edges are drawn behind the visible room.
Occlusion culling enabled: only the rooms that are actually visible are rendered, and the sphere, hidden by the wall, is skipped. Screenshot from Godot.Godot Engine documentation (Juan Linietsky, Ariel Manzur and the Godot community), CC BY 3.0

#Culling, draw calls and HLOD

Every object that survives culling costs at least one draw call per material. Epic's stats guidance names visible static mesh elements as "the single biggest contributor to rendering thread time" (Unreal Engine documentation: Visibility and Occlusion Culling in Unreal…). Culling and draw-call reduction pull in opposite directions, though. Merging a whole street into one mesh saves draw calls, but the merged mesh is drawn whenever any part of it is visible. Splitting it into many pieces lets culling remove more, at the price of more objects to test and draw.

HLOD is the usual compromise for distance: far away, many objects become one proxy with few draw calls; close up, the separate pieces return and cull individually. See instancing for the other common way to draw many copies cheaply.

#How artists can help

  • Size modular pieces for culling. A wall piece that spans a whole building can only be culled as a whole. Pieces at room or facade scale let occlusion and frustum culling work. See modular kits.
  • Build real occluders. Walls, cliffs and buildings that block views help occlusion more than open, see-through spaces. Unity says its occlusion culling "works best in Scenes where small, well-defined areas are clearly separated", such as rooms joined by corridors (Unity Manual: Occlusion culling). In layout terms, a bend in a corridor is also a culling tool; see sightlines and vistas.
  • Set cull distances by size. A bolt does not need to draw at 150 m. A Cull Distance Volume holds arrays of sizes and distances so small objects stop drawing sooner (Unreal Engine documentation: Visibility and Occlusion Culling in Unreal…).
  • Keep bounds tight. Epic warns that "Increasing an Actor's bounds can potentially impact performance and shadow quality" (Unreal Engine documentation: Visibility and Occlusion Culling in Unreal…). Inflated bounds make objects look visible when they are not.
  • Know what cannot occlude. In Unity, dynamic objects can be occluded, but "Dynamic GameObjects cannot occlude other GameObjects" (Unity Manual: Occlusion culling).
A bar chart of example cull distances. Small objects such as bolts and cups stop drawing beyond 30 metres, medium objects such as crates and chairs beyond 120 metres, and buildings have a distance of 0, meaning they are never distance culled.
Example size and distance pairs for a Cull Distance Volume. The values are illustrations; set yours by checking at which distance each size stops being noticeable.Diagram by the handbook author

#How to set one up

Unreal Engine

  1. Check the defaults first: frustum culling and hardware occlusion queries are already on (Unreal Engine documentation: Visibility and Occlusion Culling in Unreal…).
  2. Place a Cull Distance Volume around an outdoor area and fill its size and distance arrays, for example as in the chart above (Unreal Engine documentation: Visibility and Occlusion Culling in Unreal…).
  3. For special actors, set a per-actor maximum draw distance in the Details panel; the Current Maximum Draw Distance shows the volume's effect (Unreal Engine documentation: Visibility and Occlusion Culling in Unreal…).
  4. For small levels or mobile, add a Precomputed Visibility Volume and build lighting (Unreal Engine documentation: Visibility and Occlusion Culling in Unreal…).
  5. Measure with stat initviews in Play In Editor or Standalone, and check occluded objects with r.VisualizeOccludedPrimitives 1 and FreezeRendering (Unreal Engine documentation: Visibility and Occlusion Culling in Unreal…). Wireframe view disables occlusion culling, so do not judge it there (Unreal Engine documentation: Visibility and Occlusion Culling in Unreal…).

Unity

  1. Frustum culling is already active on every camera (Unity Manual: Occlusion culling).
  2. Open the Occlusion Culling window, set up the scene and bake (Unity Manual: Occlusion culling).
  3. Enable Occlusion Culling on the camera, which then runs both kinds (Unity Manual: Occlusion culling).
  4. In URP or HDRP on Unity 6, compare with GPU occlusion culling, which the manual offers as an alternative (Unity Manual: Occlusion culling).

#Video tutorials

#Use in shipped games

Related: draw calls · hierarchical LOD · level of detail · instancing · overdraw · frame budgets · performance and profiling · level streaming and World Partition · winding order and backface culling

#Further reading and watching

References

  1. Epic Games · Visibility and Occlusion Culling in Unreal Engine · Unreal Engine documentation · docs · accessed 2026-10-22
  2. Unity Technologies · Occlusion culling · Unity Manual (Unity 6) · docs · accessed 2026-10-22
  3. Umbra Software and CD PROJEKT RED · Solving Visibility and Streaming in The Witcher 3: Wild Hunt with Umbra 3 · GDC 2014 (GDC Vault), 2014 · talk · accessed 2026-10-22
  4. Otso Makinen (Umbra Software) and Hao Chen (Bungie) · Powering up Destiny's Level Creation and Rendering with Umbra 3 · GDC 2013 (GDC Vault), 2013 · talk · accessed 2026-10-22

Also consulted

Last updated 2026-10-22