Quick answer: Replace the default Grass shader with a mobile-friendly one on each Detail Prototype, enable GPU Instancing on the prototype, lower Detail Distance to ~30m and Detail Density to 0.5 or less. Editor uses desktop fallbacks; mobile builds need explicit setup.

Editor view: lush grass everywhere. Build to Android: bare dirt. The Terrain Detail system has a mobile-specific configuration path that is easy to skip.

The Symptom

Terrain Detail brushes visible in editor (and even the Game window when targeting Standalone) but missing on Android, iOS, or in URP mobile builds. Trees may render fine; only Detail Meshes / Detail Textures vanish.

What Causes This

Two things differ between editor and mobile:

  1. The default Grass shader doesn’t compile on GLES 3 or has variants stripped during build.
  2. Without GPU Instancing on the prototype, instancing falls back to per-instance draw calls, which are too expensive and the system silently culls.

The Fix

Step 1: Mobile-friendly material per prototype. Open the Terrain → Paint Details. Edit the Detail Prototype. For Detail Texture (single-quad billboard) replace the default Material with a custom one based on URP’s Universal Render Pipeline / Particles / Lit Unlit or a Shader Graph that respects the Terrain Engine path.

For Detail Mesh (a full mesh per blade), the Material on the mesh must have Enable GPU Instancing checked.

Step 2: Tune density and distance.

Terrain Settings → Mesh Resolution / Heightmap:
  Detail Distance:           30     // 30m, default 80
  Detail Density:            0.5
  Detail Resolution Per Patch: 8

Detail Prototype:
  Render Mode:               Grass      // for billboards
  Use GPU Instancing:        true
  Min/Max Width/Height:      modest range
  Healthy Color:             desaturated green

Step 3: Strip-safe shader variants. Edit Project Settings → Graphics → Always-Included Shaders. Add the grass material’s shader explicitly. This prevents the build process from stripping it as “not directly referenced.”

Verifying on Device

Build to a development build with Autoconnect Profiler. In Frame Debugger, look for Draw Mesh Instanced calls naming your detail prototype. If absent, the prototype isn’t rendering at all (material/shader issue). If present but visually missing, density or culling is too aggressive.

Alternatives Worth Considering

For mobile, consider replacing Terrain Details entirely with:

Each gives more control over draw call counts and shader paths than the Terrain Detail system on mobile.

“Mobile shader. GPU instancing. Lower density and distance. Always-included shaders. Grass appears.”

Related Issues

For shader stripping, see shader stripping. For mobile draw call counts, see mobile draw calls.

Mobile shader. Instancing. Trim density. Grass blooms on device.