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:
- The default Grass shader doesn’t compile on GLES 3 or has variants stripped during build.
- 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:
- Scattered prefabs placed by an editor tool, instanced via Graphics.DrawMeshInstanced.
- Static batched meshes with vertex-color wind animation in the shader.
- Impostor cards rather than meshes for distant grass.
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.