Culling removes objects from rendering before they cost anything. It is the most effective optimisation available, because the cheapest object is one that is never drawn.
Frustum culling
Objects outside the camera's view volume are skipped. Automatic in every engine, and it depends on accurate bounding volumes — an object with a bounding box far larger than itself gets drawn when it should not.
This matters for skinned meshes and for anything whose bounds are computed once and then animated outside them.
Occlusion culling
Objects hidden behind other objects are skipped. Harder, because it requires knowing what is in front of what.
- Precomputed — visibility baked offline. Fast at runtime, requires a bake, and only handles static geometry.
- Hardware/runtime — the GPU tests visibility, typically one frame late. Handles dynamic objects at some cost and with occasional pop-in.
Level design matters here: a scene with long open sightlines occludes nothing, and a scene divided by walls and corners occludes a great deal. This is why interior levels perform differently from open ones.
Distance culling
Objects beyond a distance are not drawn at all. Blunt and effective, particularly for small props — a bolt on a wall does not need to render at eighty metres, whatever its LOD.
Per-object distances, tuned by size, work better than one global value.
Portals and cells
Dividing a level into cells connected by portals, so only cells visible through a chain of portals are drawn. Powerful for interiors, and it requires building the level with that structure in mind.
What artists control
- Sensible bounding volumes
- Level layouts that actually occlude
- Occluder geometry — simplified invisible meshes that block visibility cheaply
- Per-object cull distances set deliberately rather than defaulted