Skip to content
← Back to Blog optimization

Mobile LOD Streaming in Unity URP and Godot 4: Cut GPU Costs Fast

By BitSoul3D5 min read215 views

Skipping LOD on mobile is a guaranteed path to thermal throttling, dropped frames, and one-star reviews about battery drain. Every polygon your GPU rasterizes for a building 40 metres away is wasted budget that could have gone toward smooth gameplay. This guide walks through configuring LOD Groups in Unity URP and Godot 4's LOD system using free GLB assets from BitSoul's marketplace, covering transition thresholds, screen percentages, and the common mistakes that cancel out all your hard work.

Mobile LOD Streaming in Unity URP and Godot 4: Cut GPU Costs Fast

Why Mobile LODs Are Non-Negotiable

Mobile GPUs are tile-based deferred renderers. They process geometry in screen-space tiles, meaning every visible triangle — regardless of how small it is on screen — costs fillrate and bandwidth. A 4,000-polygon building occupying 2% of the screen costs proportionally the same as one filling the entire display.

LOD systems solve this by swapping high-detail meshes for progressively simpler ones as the camera moves away. The goal is not visual perfection at every distance; it is imperceptible degradation. Players notice stutters. They rarely notice that the tower in the background has 200 triangles instead of 4,000.

Why Mobile LODs Are Non-Negotiable — illustrated

Key numbers to keep in mind:

Unity URP LOD Group Setup

Unity's LODGroup component handles LOD switching. When importing a GLB from BitSoul, Unity auto-imports it as a static mesh. You add LOD behaviour in the editor.

Step 1: Prepare LOD meshes

You need at least three mesh variants per asset:

Step 2: Configure LODGroup thresholds

Screen percentages in Unity are expressed as a fraction of the vertical screen height. Typical values for medium-scale props:

LOD LevelScreen % ThresholdTriangle Count
LOD060% → 100%3,000
LOD115% → 60%1,200
LOD23% → 15%350
Culled0% → 3%0

In the LODGroup inspector, drag each LOD mesh into its slot, then drag the slider to match these percentages. For mobile, lower the LOD0 threshold — push the transition earlier than you think you need to.

Step 3: URP-specific settings

In your UniversalRenderPipelineAsset, confirm LOD Cross Fade is enabled if you want smooth dithered transitions. On mobile, cross-fading has a small GPU cost — test whether the visual quality justifies it on your target device. For pure performance, disable it and accept the pop.

// Force LOD bias at runtime for quality/performance trade-off
void SetMobileLODBias(float bias)
{
    QualitySettings.lodBias = bias;
    // 0.5f = transitions happen earlier (better perf)
    // 2.0f = transitions happen later (better visuals)
}

Set lodBias to 0.7 in your mobile quality tier. This shifts all LOD transitions 30% closer to the camera without manually re-authoring every LODGroup.

Step 3: URP-specific settings — illustrated

Godot 4 LOD Configuration

Godot 4 introduced automatic LOD generation for MeshInstance3D nodes, plus manual VisibilityNotifier3D-based culling.

Automatic LOD (Godot's built-in simplification)

Godot 4 can generate LODs at import time from your GLB. In the Import panel:

  1. Select your .glb file
  2. Enable Meshes → Generate LODs
  3. Set LOD Bias — a multiplier on transition distances (default 1.0; use 0.5 for mobile)
  4. Set Normal Merge Angle to 25° for hard-surface props

This produces automatic LOD meshes stored inside the .res file. No manual Blender work required for simple props.

Manual LOD with VisibilityRangeBegin / End

For assets where automatic simplification produces poor results (thin railings, complex silhouettes), use manual meshes with GeometryInstance3D.visibility_range_begin and visibility_range_end:

# In _ready(), configure range-based visibility
func configure_lod(lod0: MeshInstance3D, lod1: MeshInstance3D, lod2: MeshInstance3D) -> void:
    lod0.visibility_range_end = 20.0          # switch to LOD1 after 20 m
    lod0.visibility_range_end_margin = 1.0    # 1 m hysteresis
    lod1.visibility_range_begin = 20.0
    lod1.visibility_range_end = 60.0
    lod1.visibility_range_end_margin = 2.0
    lod2.visibility_range_begin = 60.0
    lod2.visibility_range_end = 120.0         # cull beyond 120 m

The margin values create hysteresis — preventing rapid LOD flickering when the camera sits exactly at the transition boundary.

Godot 4 LOD checklist for mobile

Common Mistakes That Kill LOD Gains

Forgetting shadow casters. LOD switching only affects the main camera pass. Shadows still use the full LOD0 mesh by default in both engines. In Unity URP, set Shadow LOD Bias in the pipeline asset. In Godot 4, set MeshInstance3D.cast_shadow = SHADOW_CASTING_SETTING_OFF on LOD1 and LOD2 meshes.

Skinned mesh LODs. LODGroup works on SkinnedMeshRenderer in Unity, but Godot 4's auto-LOD does not support skeletal meshes — you must create LOD variants manually and swap them with AnimationTree or code.

Not testing on device. Unity's Scene view and Godot's editor viewport both render at desktop resolution. LOD thresholds calibrated in the editor will fire too late on a 720p mobile screen. Always profile on target hardware with actual screen dimensions.

Free GLB models from BitSoul marketplace ship in a single LOD — which is standard for marketplace assets. Build your LOD pipeline as described above to take them to mobile-ready state without paying for additional mesh variants.


This post is part of the Ultimate Guide to Free 3D Game Assets — BitSoul's complete reference for formats, texturing, rigging, optimization, and engine integration.


Need drop-in assets for this workflow? Grab the 67-model Weapons Bundle on the BitSoul marketplace and drop them straight into your project.

Tags: weapons

Skip the modeling — download it instead

A free BitSoul3D account gets you 2 GLB downloads every month for personal use plus 25 one-time AI Engine credits, no card required. PBR-textured GLB downloads with a full 3D preview before you buy, for Unreal, Unity, Godot or Blender — OBJ and 3D-printable STL come with any purchase or paid plan.

Browse 1,051 models — from $4.99 → or start free (2 downloads a month)