Big open scenes slow down for two simple reasons: Unity draws objects in more detail than you can see, and it draws objects you can’t see at all. LOD Groups fix the first problem by swapping in simpler meshes at a distance. Occlusion culling fixes the second by skipping objects hidden behind walls and hills. This guide covers both in Unity 6: setting up LODs, choosing transition distances, cross-fading, baked occlusion culling, Unity 6’s GPU occlusion culling, and the cheap wins (far clip planes and per-layer cull distances) people forget.
What Unity Culls for Free
Frustum culling is automatic: anything outside the camera’s view pyramid isn’t drawn. But anything inside it is, even if it’s behind a building or 2 km away and a few pixels wide. That’s where LOD and occlusion culling come in.
Before optimizing, find out whether you’re CPU-bound (too many objects, see our draw calls guide) or GPU-bound (too many triangles or pixels). The Profiler tells you which. LODs help both. Occlusion culling mainly helps the CPU and vertex work.
Setting Up a LOD Group
A LOD Group switches between versions of an object based on how much of the screen it covers:
- Create an empty parent object (for example Tree) and add a LOD Group component.
- Add child objects for each level: Tree_LOD0 (full detail), Tree_LOD1 (about 50% of the triangles), Tree_LOD2 (about 15%), and optionally a billboard or nothing.
- In the LOD Group’s bar, select each LOD slot and drag the matching child’s renderer into it.
- Drag the dividers to set transitions. The rightmost grey area is Culled: the object disappears completely.
If you import a model whose meshes are named _LOD0, _LOD1, and so on, Unity builds the LOD Group automatically. Name meshes that way in Blender and you save a lot of setup.
Transition Distances, Bias and Cross-Fade
Transitions are measured in screen-relative height (the percentage of screen height the object’s bounds cover), not metres. This adapts automatically to field of view and resolution.
| Level | Triangles | Typical switch at |
|---|---|---|
| LOD0 | 100% | > 50% screen height |
| LOD1 | ~50% | 50% – 20% |
| LOD2 | ~15–25% | 20% – 5% |
| LOD3 / billboard | ~2–5% | 5% – 1% |
| Culled | 0 | < 1% (small props higher) |
Two global settings in Project Settings > Quality:
- LOD Bias: multiplies all transition distances. Values above 1 keep high detail longer (higher quality tiers), below 1 switches sooner (low-end tiers). This makes LOD Bias the easiest per-quality-level knob.
- Maximum LOD Level: forces a minimum LOD, for example skipping LOD0 entirely on mobile.
Popping (visible snaps between levels) is reduced with Fade Mode: Cross Fade on the LOD Group, which dithers between levels for a short time. URP supports LOD cross-fade (enable it in the URP Asset). SpeedTree uses its own SpeedTree fade mode.
Where LOD Meshes Come From
- Your modelling tool: Blender’s Decimate modifier makes quick LOD1 and LOD2 versions. Export them as _LOD-suffixed meshes.
- Asset Store tools: automatic LOD generators can create levels in the Editor (see our Asset Store tools roundup).
- Store assets: many environment packs already include LODs. Check before buying.
- Impostors/billboards: for distant trees and buildings, a camera-facing quad with a pre-rendered image replaces thousands of triangles.
Unity Terrain trees handle LODs and billboards themselves (see the terrain tutorial).
Baked Occlusion Culling
Baked occlusion culling precomputes which areas of a level can see which others, then skips hidden objects at runtime. It suits indoor levels, cities and anything with large view-blocking walls.
- Mark big, solid, non-moving objects (walls, buildings, terrain features) as Occluder Static. These block vision.
- Mark objects that should be hidden as Occludee Static. Most static props qualify. Moving objects are culled as occludees automatically through their bounds, as long as Dynamic Occlusion is enabled on their renderer.
- Open Window > Rendering > Occlusion Culling, check the Bake tab settings, and click Bake.
- Make sure Occlusion Culling is ticked on the camera.
- Use the Visualization tab and move the camera in the Scene view to watch objects disappear behind walls.
Key bake settings: Smallest Occluder (objects smaller than this don’t block vision, so raise it to keep bake data small) and Smallest Hole (gaps smaller than this are treated as solid, so set it to the smallest gap you can see through, such as a window). Don’t mark thin or transparent objects (fences, glass) as occluders.
Limitations: occluders can’t move, and the bake must be redone when the level changes. Open landscapes with few blockers see little benefit.
GPU Occlusion Culling in Unity 6
Unity 6 adds GPU occlusion culling, which works at runtime with no bake, using the depth of the previous frame to discard hidden objects. It handles dynamic occluders too. Requirements:
- The GPU Resident Drawer enabled in the URP Asset (Instanced Drawing), with Forward+ rendering.
- Then tick GPU Occlusion in the URP Asset.
- A platform with compute shader support.
It’s most effective when lots of instanced geometry sits behind large occluders. You can combine it with baked occlusion culling. Measure both ways on your target hardware.
🏙️ Building big worlds?
Occlusion bakes and lightmaps for large levels take serious CPU time. A machine with more cores pays for itself fast. Our hardware guide has good-value options.
Cheap Wins: Far Plane and Layer Cull Distances
Camera far clip plane: the default is 1000 m. If your level fog hides everything past 300 m, set the far plane to about 320. Every object beyond it is culled for free, and depth precision improves too.
Per-layer cull distances: small props don’t need to render as far as mountains. Put grass, debris and small props on their own layers and set shorter distances:
[RequireComponent(typeof(Camera))]
public class LayerCullDistances : MonoBehaviour
{
void Start()
{
var cam = GetComponent<Camera>();
float[] distances = new float[32]; // 0 = use far plane
distances[LayerMask.NameToLayer("SmallProps")] = 60f;
distances[LayerMask.NameToLayer("Details")] = 120f;
cam.layerCullDistances = distances;
cam.layerCullSpherical = true; // distance, not plane-based (no popping when turning)
}
}
Combine with fog so things fade out rather than pop. Shadows are expensive too: lower the URP Asset’s Shadow Max Distance to what players actually notice (often 50–80 m).
Troubleshooting
Objects visibly pop between LOD levels
Transitions are too close to the camera or levels differ too much. Push transitions further out, add an intermediate LOD, or enable Cross Fade.
LOD never changes
LOD Bias is very high in the active Quality level, Maximum LOD Level is forcing a level, or the renderers aren’t assigned to the LOD slots (they’re just children).
Objects disappear while still visible after an occlusion bake
Thin or transparent objects were marked Occluder Static, or Smallest Hole is larger than gaps you can see through. Fix the flags or settings and re-bake.
Occlusion culling makes no difference
The camera’s Occlusion Culling box is unticked, the scene has few large occluders, or the data wasn’t baked for the loaded scene (each scene needs its own bake, and additive scenes are baked together).
Objects pop out when turning the camera
Plane-based layer cull distances. Set layerCullSpherical = true.
FAQ
What is LOD in Unity?
Level of Detail: swapping an object’s mesh for simpler versions as it gets smaller on screen, which saves triangles and rendering cost.
Does Unity do occlusion culling automatically?
Frustum culling is automatic. Occlusion culling needs a bake, or Unity 6’s GPU occlusion culling with the GPU Resident Drawer.
How many LOD levels should I use?
Usually 3–4 plus culled. Hero objects might have more. Small props often need just one LOD plus culling.
Is occlusion culling worth it for open worlds?
Less so. With few big blockers, LODs, far plane, layer cull distances and fog give more benefit.
Can moving objects be occluders?
Not with baked occlusion culling. They can be occludees. GPU occlusion culling in Unity 6 handles dynamic occluders.
Reader questions
Asked by readers of this article and answered by AI. Behavior can differ between Unity versions, so test in yours.




Leave a Reply