[UE5] LOD and Culling Basics: Simplifying Distance and Cutting Draws for What You Can't See

Created: 2025-12-12Last updated: 2026-09-07

Diagrams UE5's LOD, frustum culling, occlusion, and distance culling. An introduction that tries simplification and hiding on a single mesh, then confirms results with Cull Distance Volumes and FreezeRendering.

As you add rocks and trees, the game can get heavy when you survey a wide view. You want detail on nearby rocks, but do distant small rocks need the same detail? Rocks completely hidden behind a wall probably do not need drawing into the current frame either.

Using those differences to reduce rendering work is what LOD and culling do. LOD simplifies shapes; culling narrows what gets drawn. Neither is "delete everything to go faster" — both are adjustments that preserve the appearance the player needs.

Drawing detail up close, simplifying what appears small, and cutting unnecessary draws

In this article we try "the shape changes" and "it stops being displayed" on one mesh, the thing representing a 3D model's shape. After that we move on to checking objects hidden behind a wall and setting distances for many objects at once.

What You'll Learn

  • The difference between reducing draws via LOD, frustum, occlusion, and distance
  • Generating LODs and how Screen Size switches between them
  • Cull Distance Volume settings, and what to check when nothing disappears
  • The flow of moving between appearance and measurement to reach usable settings

This assumes Windows UE5 and experience placing things in a level. The hands-on uses a Static Mesh placed in a level, without Nanite. No Blueprint or external assets are needed. The diagrams are schematics for this blog.

Sponsored

First, separate the work you are reducing

LOD (Level of Detail) prepares shapes of differing detail for the same object. It uses a detailed shape up close and a simplified one once it becomes small on screen.

Culling removes objects matching a condition from the draw set. Outside the view, behind something, or too far away, you can reduce the work of drawing that object to the screen.

LOD simplifies the shape drawn; culling narrows what gets drawn
MethodWhat it changesExample
LODSimplifies one object's shapeReduce fine bumps on a distant rock
Frustum cullingExcludes what is outside the camera's viewDrop rocks behind you from the draw set
Occlusion cullingExcludes what is hidden behind nearer objectsDrop rocks fully hidden by a wall
Distance cullingExcludes things beyond a set distanceRemove small distant decorations

Reducing triangles with LOD reduces the work of processing that shape. Culling reduces the target's draw preparation and GPU-side drawing. But it is not fixed that "LOD is GPU only and culling is Draw only." Compare overall and per-thread times with stat unit.

Being culled does not delete the Actor. Tick, collision, and in-memory data can all remain. Keep "not drawing it to the screen" separate from "removing it from the game."

LOD: simplifying things that appear small

On a traditional Static Mesh, the most detailed shape is LOD0 and the simplified versions are LOD1, LOD2, and so on. So the silhouette does not change dramatically when switching, it uses a shape suited to the apparent size.

Using detailed and simplified shapes of the same object according to on-screen size

Detail can be dropped at distance, but how much depends on the object. A rock's fine bumps may go unnoticed, while a missing bridge pillar or a broken tree silhouette can be visible even from far away.

First, prepare LODs on one mesh

Use a Third Person template project you can walk in. For practice, copy the Engine's basic Sphere shape into your project.

  1. Turn on "Show Engine Content" in the Content Browser's "Settings."
  2. Select Sphere under "Engine → BasicShapes" and copy it with Ctrl + C.
  3. Create a practice folder in your own "Content," paste with Ctrl + V, and name it SM_VisibilityProbe.
  4. Double-click the copied asset to open the Static Mesh Editor.
  5. Confirm "Enable Nanite Support" under "Nanite Settings" is off. If you changed it, press "Apply Changes."

From here we edit that copy. If you already have your own rocks, you can test on a duplicate of them.

Set Number of LODs to 3 under "LOD Settings" and press "Apply Changes." That is three levels including LOD0. Next open "Reduction Settings" for LOD1 and LOD2, set "Percent Triangles" to 50 and 15 respectively, and apply.

Percent Triangles adjusts the proportion of triangles kept in a simplified version. We reduce it heavily here to make the difference easy to see. Also look at each LOD's triangle count and confirm they actually decreased in stages.

Preparing LOD0 through LOD2 on the practice mesh and checking each level's triangle count

Turn Auto Compute LOD Distances on at first and let it compute switching thresholds. If the LOD items are not visible, turn on "Custom" in the "LOD Picker" to show each level.

Move the Static Mesh Editor's preview away and, if the displayed LOD number changes, you have confirmed switching. If the number stays manually specified, return it to "LOD Auto." Save once confirmed.

Screen Size is on-screen size, not distance

Each LOD's Screen Size is the size threshold deciding the switch. It is computed from how large in diameter the sphere enclosing the mesh appears on screen. Do not read 0.25 as "25 meters" or "25% of screen area."

At the same distance, a large rock and a small stone appear at different sizes on screen. Zooming the camera to make something large also changes the detail needed.

At the same distance, an object appearing small and one appearing large need different detail

To tune manually, turn Auto Compute LOD Distances off. Set LOD1 to 0.5 and LOD2 to 0.2, for example, and move the preview back and forth to watch switching. These are practice values, not universal recommendations for all assets.

To delay switching to LOD1 and keep the detailed shape longer, make LOD1's Screen Size smaller. To simplify earlier, make it larger. Rather than chasing the numbers alone, confirm the silhouette does not jump when it changes.

In the level, color-code to see switching

Place one SM_VisibilityProbe in the level. Leave Scale at 1 on X, Y, and Z, and place it where it does not sink into the floor. From the View Mode menu showing "Lit" and friends in the viewport, choose "Level of Detail Coloration → Mesh LOD Coloration." Move the camera closer and farther and watch the per-LOD colors switch.

Once you confirm the color change, return to Lit and check with the normal appearance too. Colors changing confirms the setting; the silhouette not bothering you confirms the quality.

Sponsored

Culling: cutting draws outside the view and behind objects

The space the camera can capture is called the frustum. It is the volumetric range of view spreading out from the camera. Frustum culling removes objects outside that range from the draw set.

Meanwhile, some objects inside the range are completely hidden behind a wall. Occlusion culling is what checks that blocking.

Distinguishing objects outside the camera's view from objects inside it hidden fully behind a wall

In a normal PC project the engine performs these tests. Rather than building your own system first, confirm what is being excluded. A corridor's corner can hide what is beyond, while an RTS plain viewed from a high camera hides little. The same occlusion works differently depending on the scene.

Bounds are the test volume enclosing an object

Visibility tests use the bounds enclosing a mesh. It is a box or sphere expressing the approximate extent. Show them with "Show → Advanced → Bounds" in the editor.

Bounds much larger than the object are one reason something can be treated as "maybe still visible" while hidden. Too small, on the other hand, leads to visible parts disappearing.

Bounds enclosing an object that are too large stick out past the wall and stay a visible candidate

For example, when a material sways a tree, the bounds need to include the moved branches. Rather than shrinking them just to cull sooner, match the test volume to the visual motion.

Occlusion testing costs work too, and some approaches lag in reflecting results. And draws needed for things like shadows are handled separately even when not directly visible on screen. Do not assume "once it is behind something, all cost related to that Actor is zero."

Distance culling: try it on one, then set many at once

Even with distant objects visible, you can decide "beyond here, do not draw small decorations." Set it on one first and confirm what changes.

Cull just one at 15 meters

  1. Select the SM_VisibilityProbe placed in the level and set "Mobility" in the Details to Static. That treats it as something that does not move during the game.
  2. Search "Draw Distance" in the Details and set Desired Max Draw Distance to 1500.
  3. Turn "Never Distance Cull" off. With it on, no distance-based exclusion happens.
  4. Deselect, put the mouse in the viewport, and press G to switch to Game View.
  5. Move toward and away from the sphere and confirm the display switches.

UE's standard distance unit is 1 uu = 1 cm, so 1500 is 15 m. The distance is measured from the camera to the target's bounds center, not from the player's feet. Game View is a mode that hides editing displays and shows how it looks in game.

The sphere is displayed under 15 m from the camera and hidden by distance beyond that

Success is it vanishing as you move away and returning as you approach. We use a deliberately short distance so the mechanism is clear.

Group by size with a Cull Distance Volume

Instead of entering a distance for each rock and prop, a Cull Distance Volume applies settings to targets inside a range at once. A Volume expresses the spatial range the settings apply to.

  1. Set the sphere's Desired Max Draw Distance back to 0 to remove its individual limit. Turn "Allow Cull Distance Volume" on.
  2. Search Cull Distance Volume in "Place Actors," place it, and expand it to enclose the sphere.
  3. Turn the Volume's "Enabled" on and match "Cull Distances" in the Details to the table below. Edit the initial rows and add more with "+" if needed.
SizeCull DistanceIntent
1001500Small things up to 15 m
5004000Medium things up to 40 m
100000Large things are never distance-culled

Size is the target's bounds size and Cull Distance is the distance at which it disappears. Each target uses the row with the nearest Size. Size 100 is not a range meaning "everything 100 or under," and Size 0 does not designate "all sizes."

Choosing the row nearest the target's size and using that row's Cull Distance

Nor does it smoothly interpolate distances between rows. Select a target and look at Current Max Draw Distance to see which distance was actually applied. Confirm the sphere gets 1500 and move toward and away again in Game View.

A row whose Cull Distance is 0 means "do not distance-cull that row's targets." Use it to keep large buildings visible from far away. When several Volumes overlap or an individual limit exists, the shortest non-zero distance wins, so confirm the result in Current Max Draw Distance.

When it does not disappear, or disappears too soon

SituationWhat to check first
It does not disappear while editingWhether you deselected and switched to Game View. Also confirm in Play
The individual setting does nothingWhether Nanite is off, whether Never Distance Cull is off, whether the camera is far enough
Only the Volume has no effectWhether it encloses the target, whether Enabled and Allow Cull Distance Volume are on, whether the target is a Static placed object
It disappears closer than expectedWhat Current Max Draw Distance says. Whether another Volume or individual setting remains
Even the large floor disappearsWhether you prepared a row with a large Size and Cull Distance 0. Turn the floor's Allow Cull Distance Volume off if needed

We test with a pre-placed ordinary Static Mesh here. When extending to Foliage, instances, or runtime-spawned objects, check each one's placement method and distance settings.

FreezeRendering: confirming how hidden objects are treated

Even when culling works, only invisible things stop being drawn, so it is hard to tell from the front view. FreezeRendering freezes the rendering state at that viewpoint so you can inspect from another angle.

Put the practice sphere behind a sufficiently large opaque wall. Scaling a basic Cube in width and height makes a confirmation wall. Here, to avoid mixing with distance culling, set the sphere's Desired Max Draw Distance to 0 and turn Allow Cull Distance Volume off.

  1. Set the editor's level viewport to Lit and move to a position where the sphere is fully hidden by the wall.
  2. Wait a moment for the tests to settle and enter FreezeRendering in the console.
  3. Move the camera to the side of the wall and peek behind it.
  4. If the sphere was excluded at the moment you froze, it is not drawn even when you go around.
  5. Enter FreezeRendering again to unfreeze and confirm the sphere reappears.
Freezing the rendering state in front of the wall, checking from the side, then unfreezing

Open the console the same way as in the stat unit article. While frozen this is not the normal play display, so avoid comparing performance in this state and unfreeze after checking.

If the sphere remains, check whether part of it shows past the wall and whether its bounds stick out. Wireframe display does not confirm occlusion, so use Lit.

As another check, r.VisualizeOccludedPrimitives 1 in the editor shows the bounds of occlusion-excluded objects as green boxes. Set it back to 0 afterwards.

Sponsored

Hands-On: comparing before and after while keeping appearance

Once you have confirmed the mechanism on one, increase the same spheres a little at a time. At the end, replace them with your own rocks and trees and look for settings that preserve appearance.

Change only the settings with the same layout

Use an open spot away from the wall used for occlusion. Duplicate the sphere with Alt + drag and line up several rows from near to far. About 32 is enough at first. Increase to 128 or 256 if needed. Space them laterally so they do not overlap into one line from the front, and create rows both within 15 m of the camera and beyond it.

Enclose the whole set in a Cull Distance Volume, turn the spheres' Allow Cull Distance Volume on, and align Desired Max Draw Distance to 0. Toggling the Volume's Enabled lets you compare with and without distance culling on the same layout.

Comparing by changing LOD and distance culling one at a time on the same layout

We compare three states. Note the values you need to restore, such as the asset's Screen Size, before you start.

StateSettingsWhat to watch
A: keep the detailed shapePlaced spheres' Forced LOD Model 1, Volume offThe comparison baseline
B: automatic LOD switchingForced LOD Model 0, Volume offWhether small spheres simplify
C: also exclude the distantForced LOD Model 0, Volume onWhether distant spheres leave the draw set

Select the level's spheres together and search Forced LOD Model in the Details to change it. Here 0 is automatic and 1 is locked to LOD0. Note that it is offset by one from the LOD number itself.

Read what changed, not just the numbers

Launch Standalone in each state and measure from the same position, orientation, quality, resolution, and FPS cap. Avoid measuring right after loading; note Frame, Game, Draw, and GPU with stat unit and rendering totals with stat scenerendering.

In stat initviews, Frustum Culled Primitives is the count excluded as outside the view and Occluded Primitives the count excluded by occlusion. A primitive here is the rendering side's unit such as a mesh. It does not necessarily map one-to-one to an Actor.

ResultWhat to consider next
Triangles dropped in B but Frame barely changedOther work or the FPS cap may be limiting the whole in this scene
Distant things vanished in C but Draw barely changedInvestigate whether the target count is small or other draw prep dominates
The Occluded count is smallNatural in an open view. Do not target a high exclusion rate itself
Times shortened, but spheres pop in ahead of youThe distance is too short. Adjust display quality too

Read triangle count changes alongside each LOD's display in the Static Mesh Editor and the level's LOD coloration. stat scenerendering's Mesh draw calls is useful too, but it will not necessarily equal the placement count. It varies with how identical meshes are batched, with materials, and with shadow draws.

A small number of spheres is practice for confirming what the settings mean. No particular time saving is guaranteed and the difference may be tiny. Returning the settings to A once to confirm the original trend also reveals whether conditions changed.

Walk around and decide the distance at which it may vanish

Walk around in state C. If sudden pop-in bothers you, extend the Cull Distance from 1500 to 2500 and re-check appearance and time. Set important buildings and landmarks to stay visible from far away.

At the end, return Forced LOD Model to 0 and confirm in the normal Lit display with FreezeRendering unfrozen. Close the diagnostic displays too and check how it looks in ordinary play.

Choosing between this and Nanite

Nanite is a rendering system that splits a mesh into fine clusters and automatically chooses the detail and display range it needs. It differs from the flow of manually tuning LOD0, 1, and 2 on an ordinary Static Mesh.

We turned Nanite off in this article to confirm traditional LOD and distance settings one at a time. Do not assume the same Cull Distance Volume settings simply apply to Nanite. Confirm the supported scope against your UE version and how meshes and Foliage are placed.

Treating a traditional mesh's stepped LODs and Nanite's cluster-based selection as separate things

Nor is it the case that vegetation is always Nanite-incompatible. Masked, which cuts out leaf shapes, and Translucent, which is see-through like glass, are different cases. Support for Skeletal Meshes has advanced too, so rather than lumping "characters are all incompatible," check the uses and constraints in the Nanite article.

Bonus: Good to Know Up Front

LOD Groups also help for large amounts of background

The Static Mesh Editor's LOD Group provides per-use settings such as SmallProp. Before entering the same settings by hand across dozens of background assets, you can start from a preset. Applying one changes existing LOD settings, so try it on a duplicate first.

There are also ways to draw in batches

To place many identical rocks or trees, Instanced Static Mesh / HISM handles them together. It does not necessarily make everything one draw call, but it is an option for reducing per-instance overhead and draw preparation.

Culling does not reduce loading

Even after reducing what is drawn, memory problems can remain while a large level's full data is still needed. In that case, go to level streaming and World Partition. HLOD, which combines distant views, is another approach worth considering on large levels.

Once you can confirm "it simplified," "it vanished by distance," and "it was excluded behind the wall" on that first object, choosing settings to try in a heavy scene becomes easier. Adjust how much you draw while thinking about what you want to keep visible from far away in your own game.

Summary

  • LOD "makes it coarser"; culling "does not draw it at all"
  • LOD switches on Screen Size, the size it occupies on screen
  • A Cull Distance Volume decides distance-based removal ranges in bulk
  • Move between appearance and measurement to trim down to what goes unnoticed

The question when tuning is "how far from the player is this object seen?" The more distant, the more boldly you can trim.

To line up many identical objects, go to reducing draw calls with instancing; to split the loading itself, go to Level Streaming.

References: Visibility and Occlusion Culling, Cull Distance Volumes, Static Mesh Automatic LOD Generation, LOD Screen Size.

Unreal Engine Notes in this section98