Blender LODs for Unity: Auto LOD Groups and Poly Count Budgets

Illustration: three versions of a 3D tree model from high to low detail wireframe side by side

A rock with 20,000 triangles looks great up close and is a waste of GPU time when it is a few pixels tall on the horizon. Levels of detail (LODs) swap in simpler meshes as objects get further away. The nice part: if you build Blender LODs for Unity with the right names, Unity creates the LOD Group for you on import. This guide shows how to make LODs in Blender with the Decimate modifier, name and export them so Unity sets everything up automatically, tune the transitions, and pick sensible poly count budgets for an indie game.

When LODs Are Worth It

LODs cut the number of vertices and triangles the GPU has to process for distant objects. They don’t reduce draw calls (each LOD is still a draw), and they cost memory for the extra meshes. So they help most when:

  • You have lots of copies of a mid or high poly object: trees, rocks, buildings, crowds.
  • The camera sees long distances, like open worlds, racing games and flight.
  • Your profiler shows the GPU is busy with geometry, not with pixel shading or post processing.

They’re mostly wasted on a top-down game with a fixed camera height, or on low-poly props of a few hundred triangles. If you are not sure where your frame time goes, check first. Our performance budgets guide covers frame time targets and how to tell if you are GPU-bound.

Poly Count Budgets for Indie Games

There’s no official number, and modern GPUs handle a lot of triangles. What hurts is millions of them across many objects, plus skinned meshes. These are reasonable starting points for LOD0, in triangles (which is what Unity counts, not Blender’s quads):

Asset Mobile PC / console
Main character 3k to 10k 15k to 50k
Enemy or NPC 1.5k to 5k 5k to 25k
Small prop 100 to 800 300 to 3k
Large prop or vehicle 1k to 5k 5k to 30k
Building or modular piece 500 to 5k 2k to 20k
Tree 1k to 5k 5k to 20k

For the lower LODs, a common ratio is roughly 50%, 25% and 10% of LOD0, then culled. Each step should be visibly fine at the distance it appears, so judge by eye, not by the number.

To see triangle counts in Blender, open the Viewport Overlays dropdown and tick Statistics. The top-left corner shows vertices, faces and triangles for the scene and the selection. In Unity, the Game view’s Stats panel shows the triangles currently being rendered.

Making LODs in Blender With Decimate

The Decimate modifier reduces polygons without touching your original mesh. Its three modes:

  • Collapse: merges edges until it hits the Ratio you set (0.5 = half the faces). The general-purpose choice.
  • Un-Subdivide: reverses subdivision on clean grid topology. Good for meshes built from subdivided quads.
  • Planar: dissolves faces that lie flat within an angle limit. Great for hard-surface buildings and props with big flat areas.

A clean non-destructive workflow:

  1. Finish the LOD0 mesh and apply transforms (Object > Apply > All Transforms).
  2. Rename it with a _LOD0 suffix, for example Rock_LOD0.
  3. Make a linked duplicate with Alt+D, right-click to cancel the move so it stays in place, and rename it Rock_LOD1. Linked duplicates share mesh data but each has its own modifiers.
  4. Add a Decimate modifier to Rock_LOD1 with Ratio 0.5.
  5. Repeat for LOD2 (Ratio 0.25) and LOD3 (Ratio 0.1).

Because the copies are linked, any fix to the LOD0 mesh updates every LOD automatically. The FBX exporter applies modifiers by default (Apply Modifiers), so Unity receives the decimated meshes.

Watch for these while decimating:

  • Silhouette first. Distant objects are recognised by outline. Check each LOD from the distance it will be seen, not up close.
  • UV seams and normals. Collapse can smear textures along UV seams and create shading artefacts. Turn on the Triangulate option if the result has odd n-gons, and check smoothing.
  • Symmetry. For symmetrical models, tick Symmetry in the modifier so both halves decimate the same way.
  • Vertex groups. Collapse can use a vertex group to protect areas such as faces or hands from heavy reduction.

For the lowest LOD of big objects, consider replacing Decimate with a hand-made simple shape, or a flat card with a baked texture for trees. A clean 100-triangle box often looks better at distance than a mangled 10% decimation.

Naming and Export So Unity Builds the LOD Group

Unity looks for mesh objects whose names end in _LOD0, _LOD1, _LOD2 and so on. When it finds them in one file, it creates a LOD Group component on the model’s root, adds each mesh to the matching level and sets default transition distances. You don’t have to add anything by hand.

For it to work reliably:

  • Use the exact suffix pattern: Name_LOD0, Name_LOD1. Start from 0.
  • Keep one asset’s LODs in one FBX file. Parent them under an empty named after the asset (for example Rock) so the hierarchy is clear.
  • All LODs should share the same origin and position, so they don’t jump when switching.
  • Export with Object Types set to Empty and Mesh, so the parent empty is included.

The other export settings (scale, axes, Apply Transform) are the same as any model. See the Blender to Unity FBX export settings guide for the full list.

If the asset uses baked lighting, only LOD0 needs good lightmap UVs. Lower LODs are lit by Light Probes by default, so place probes near LODed objects in baked scenes. Our Blender lightmap UVs guide covers the lightmap side.

🧰 Don’t want to make every LOD by hand?

For big asset libraries, dedicated LOD generators and mesh simplifiers on the Asset Store can batch-process hundreds of models at once. We reviewed the Unity tools that actually save indie devs time.

See our Unity Asset Store tool picks →

Script: Generate LOD Copies in One Click

This Blender script turns the active mesh into a full LOD set: it renames it to _LOD0, creates linked copies with Decimate modifiers, and parents everything under an empty. Run it in the Scripting workspace with one mesh selected and active.

import bpy

RATIOS = [1.0, 0.5, 0.25, 0.1]   # LOD0, LOD1, LOD2, LOD3

src = bpy.context.active_object
if src is None or src.type != 'MESH':
    raise RuntimeError("Select one mesh object first")

base = src.name.split("_LOD")[0]
collection = src.users_collection[0]

# Parent empty at the world origin keeps child positions unchanged
root = bpy.data.objects.new(base + "_Root", None)
root.empty_display_type = 'PLAIN_AXES'
collection.objects.link(root)

for i, ratio in enumerate(RATIOS):
    if i == 0:
        obj = src
    else:
        obj = src.copy()          # linked duplicate: shares mesh data
        collection.objects.link(obj)
        for m in [m for m in obj.modifiers if m.type == 'DECIMATE']:
            obj.modifiers.remove(m)
        dec = obj.modifiers.new(name="LOD Decimate", type='DECIMATE')
        dec.decimate_type = 'COLLAPSE'
        dec.ratio = ratio
        obj.hide_set(True)        # hide lower LODs in the viewport only
    obj.name = f"{base}_LOD{i}"
    obj.parent = root

print(f"Created {len(RATIOS)} LODs under {root.name}")

The lower LODs are hidden in the viewport so they don’t overlap LOD0 while you work. Before exporting, unhide them with Alt+H and select the empty and all LODs, so that an export with Selected Objects ticked includes every level. The empty is named Rock_Root rather than Rock because Blender object names must be unique.

Tuning the LOD Group in Unity

Drag the model into a scene and select it. The LOD Group component shows a bar with one coloured section per level, plus Culled at the end. The percentages are screen relative heights: the object switches to the next LOD when its bounds take up less than that share of the screen height.

  • Drag the dividers to change transition points. Move the camera icon above the bar to preview what each level looks like at that size.
  • Fade Mode: None swaps instantly. Cross Fade blends between levels to hide popping. In URP, cross fading also needs LOD Cross Fade enabled on the URP Asset.
  • Set the final Culled point so small objects disappear entirely when they’re a few pixels tall.

The LOD Group on the imported model is read-only, so tune it on a prefab variant of the model or on scene instances. A prefab variant is cleaner, because every placement shares the same tuning.

Two global settings in Project Settings > Quality affect every LOD Group:

  • LOD Bias: values above 1 keep higher detail for longer, values below 1 switch earlier. A cheap way to give low-end devices a performance boost per quality level.
  • Maximum LOD Level: skips the most detailed levels entirely. Setting it to 1 on mobile means LOD0 meshes are never used on that quality level.

To apply the same transition heights to many LOD Groups at once, this editor script (in an Editor folder) sets a halving-style preset on the selected objects and supports Undo:

using UnityEditor;
using UnityEngine;

public static class LodPresets
{
    [MenuItem("Tools/LOD/Apply Preset To Selection")]
    static void Apply()
    {
        foreach (GameObject go in Selection.gameObjects)
        {
            LODGroup group = go.GetComponent<LODGroup>();
            if (group == null) continue;

            Undo.RecordObject(group, "Apply LOD preset");
            LOD[] lods = group.GetLODs();

            // 50%, 20%, 8%, 3.2%... always strictly decreasing
            for (int i = 0; i < lods.Length; i++)
                lods[i].screenRelativeTransitionHeight = 0.5f * Mathf.Pow(0.4f, i);

            group.SetLODs(lods);
            group.RecalculateBounds();
            PrefabUtility.RecordPrefabInstancePropertyModifications(group);
        }
    }
}

LODs pair well with occlusion culling, which skips objects hidden behind walls entirely. Our LOD and occlusion culling guide covers both together, including baking occlusion data.

Troubleshooting

Unity didn’t create a LOD Group

The suffixes don’t match the pattern, or the LODs were exported in separate files. Rename to Name_LOD0, Name_LOD1 and export them together in one FBX.

Lower LODs are missing from the LOD Group

They were hidden or unselected during export with Selected Objects ticked. Select all LODs in the Outliner and re-export.

Object pops or jumps when switching LODs

The LODs have different origins or transforms. Apply transforms on all of them with the same origin. For subtle popping, use Cross Fade.

LOD1 looks broken: torn textures or weird shading

Decimate collapsed edges across UV seams or sharp edges. Try a higher ratio, use Planar mode for hard-surface pieces, or clean up the LOD by hand.

Objects switch to low detail far too early

LOD Bias in the Quality settings is low, or the transition percentages are too high. Raise LOD Bias or drag the dividers to lower values.

Frame rate didn’t improve after adding LODs

Geometry wasn’t the bottleneck. Profile again: the cost may be draw calls, overdraw, shadows or scripts.

FAQ

How many LOD levels should I make?

Two or three plus Culled is plenty for most indie assets. Small props often need only LOD0 and Culled.

Do LODs reduce draw calls?

No. Each visible LOD is still one draw per material. LODs reduce vertices and triangles, and culling removes the draw entirely.

Should I decimate characters for LODs?

Yes, but check deformation. Decimate keeps vertex weights, but heavy reduction around joints makes them bend badly. Keep more detail at shoulders, elbows and knees.

Does the _LOD naming work with .blend files?

Yes. Unity converts .blend files to FBX in the background, so object names come through the same way.

Does Decimate keep my UVs?

It keeps UVs, but collapsing edges near seams can stretch them. Always check textured LODs at their viewing distance.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *