Quick answer: Mark wall-like objects Occluder Static and small props Occludee Static, set smallest occluder to something reasonable (3–5 m for interiors), bake via Window > Rendering > Occlusion Culling > Bake. Use Visualization mode to confirm culling actually happens.
Here is how to fix Unity occlusion culling not working. You turn it on expecting a big frame rate boost on your level with lots of walls. Nothing changes. Stats window draw call count is identical with or without the bake. The Occlusion Culling panel says “Complete” but nothing behind a wall is actually being culled at runtime. Unity’s occlusion culling has a handful of setup requirements that are easy to miss, and getting any one wrong produces an empty result.
The Symptom
After baking occlusion culling, draw calls do not decrease when the camera faces a wall. The Game view renders the same number of objects regardless of visibility. Stats window shows identical “Tris” and “Batches” counts. Frame rate does not improve. The Occlusion Culling Visualization mode (in play mode) shows all objects as visible, none culled.
What Causes This
Missing Occluder Static flag on walls. For an object to hide things behind it, it must be flagged Occluder Static in its Static dropdown. Large opaque geometry — walls, floors, buildings — should have this flag. Most people click the main Static checkbox (which enables all static flags) and move on, but individual flags can be unchecked by inheritance from prefabs.
Missing Occludee Static flag on props. Objects you want to be hidden must be Occludee Static. This is separate from Occluder Static. Props, decorations, small meshes — these are occludees. Without this flag they are always drawn regardless of what is in front of them.
Smallest Occluder too large. The “Smallest Occluder” bake parameter determines the minimum size of geometry considered as an occluder. Default is 5, which excludes anything smaller than 5 meters on its shortest axis. Indoor environments with 2-3m walls need this reduced to 2 or 3.
Smallest Hole too large. “Smallest Hole” is the smallest gap that allows visibility through an occluder. If set too large, small holes in walls (windows, doors) are ignored and everything beyond is aggressively culled. If too small, seams between wall segments create false holes.
Bake not refreshed. Editing geometry after baking does not trigger a re-bake. The occlusion data is now stale and either over- or under-culls.
Camera not rendering static objects. Occlusion culling only helps on cameras where the expensive work is drawing static scene geometry. A camera rendering only UI or a post-processing pass shows no benefit because there was nothing to cull.
The Fix
Step 1: Flag objects correctly. Multi-select all large opaque walls and buildings. In the Static dropdown, ensure “Occluder Static” is enabled. For props, decorations, and anything that could be hidden, enable “Occludee Static.” Truly static geometry can have both.
// Script to flag Occluder Static on all renderers with colliders
using UnityEngine;
using UnityEditor;
public class FlagOccluders
{
[MenuItem("Tools/Flag Occluders")]
static void Flag()
{
foreach (var r in Object.FindObjectsOfType<MeshRenderer>())
{
var flags = GameObjectUtility.GetStaticEditorFlags(r.gameObject);
flags |= StaticEditorFlags.OccluderStatic | StaticEditorFlags.OccludeeStatic;
GameObjectUtility.SetStaticEditorFlags(r.gameObject, flags);
}
}
}
Run this once to flag everything, then manually unflag anything dynamic (characters, doors, movable props).
Step 2: Tune bake parameters. Open Window > Rendering > Occlusion Culling > Bake tab. Good starting values for indoor environments:
- Smallest Occluder: 2–3 m (matches wall thickness/size)
- Smallest Hole: 0.25 m (allows doorways, blocks tiny gaps)
- Backface Threshold: 100 (include all backfaces)
For outdoor levels with large buildings, raise Smallest Occluder to 5–10 m. Tune after first bake based on what actually gets culled.
Step 3: Bake and verify. Click Bake. Wait for completion (can take minutes on large scenes). Enter Play mode. Open the Visualization tab in the Occlusion Culling window. Move the Scene view camera around — objects not visible from that camera should disappear from the Scene view. If everything stays visible, the bake found nothing to cull.
Step 4: Re-bake after geometry changes. Any wall moved, added, or removed invalidates the bake. Add a note to your level-editing workflow: after finishing level changes, re-bake occlusion. For large teams, add occlusion bake to CI on merge.
When Occlusion Culling Does Not Help
Occlusion culling shines in enclosed spaces with clear sight lines broken by geometry — indoors, city streets, maze-like levels. It is less useful for:
- Open outdoor scenes: Frustum culling already handles most of the work; occlusion adds little on top.
- Low-density levels: If you only have 50 objects total, culling saves microseconds at best.
- Highly dynamic scenes: Moving walls, procedural geometry, or objects spawned at runtime cannot be baked. Consider runtime GPU occlusion culling instead.
GPU Occlusion Culling Alternative
Unity 2022.3+ added runtime GPU occlusion culling that works on dynamic scenes without baking. Enable in URP/HDRP asset settings. It uses a depth-based culling approach that runs per-frame on the GPU. Less aggressive than baked culling on static scenes but more flexible for dynamic content.
“Static flags, bake parameters, actual bake. Three steps. Skip one and culling does nothing silently.”
Related Issues
For related rendering optimizations, see Unity LOD Group Not Switching. For frame rate issues generally, Debugging Frame Rate Drops covers profiling patterns.
Visualization tab is the ground truth. If it does not cull there, nothing is culled.