Quick answer: Landscape grass silently fails when the Landscape Grass Output node is missing from the material, the driving layer weight is not painted on the terrain, or Grass Maps have never been built. Add the output node, paint the layer, then run Build > Build Grass Maps — in that order — and the spawner will start emitting instances.
You built a beautiful Landscape Grass Type asset, assigned a lush tuft mesh, dropped it into your scene, and walked the camera across the terrain. Nothing. No grass, no errors, no warnings in the output log — just empty fields where a prairie should be. This is one of the most frustrating bugs in Unreal Engine because each of the required pieces looks fine in isolation. Grass only appears when all of them are aligned, and the engine does not tell you which piece is wrong.
How Landscape Grass Actually Spawns
The runtime grass system is not driven by painted foliage instances. Instead, the landscape material executes a special node called Landscape Grass Output, which takes a Grass Type asset and a scalar mask (usually a layer weight). At load time, the engine reads a baked grass map — a cached representation of that mask — and uses it to procedurally place instances around the camera. If the node is missing, if the mask is empty, or if the map has not been baked, no grass will spawn. There is no error. The system just quietly skips.
Knowing this pipeline makes diagnosis much easier. There are exactly three link points, and one of them is almost always the culprit.
Check the Landscape Material Graph
Open the master material assigned to your landscape. In the material graph, look for a node called Landscape Grass Output. If it is not there, you do not have grass. Right-click in the graph, add the node, and populate its Grass Types array with your Grass Type asset.
The node has one input pin per Grass Type slot — the Grass input — which expects a 0–1 scalar. Plug a LandscapeLayerWeight node into it, using the name of the paint layer that should drive the grass. A common mistake is to connect the final albedo or a ground mask instead of the actual layer weight, which results in grass that fails to appear anywhere because the mask never evaluates above zero at grass-sample time.
// In the material graph:
// LandscapeLayerWeight("Grass") -> Grass input of LandscapeGrassOutput
// GrassTypes[0] = GT_Meadow_Grass
// If you want two varieties driven by the same layer:
float GrassMask = LandscapeLayerWeight("Grass");
float FlowerMask = GrassMask * LandscapeLayerWeight("Wildflowers");
// Connect GrassMask to GrassTypes[0] and FlowerMask to GrassTypes[1]
After editing the material, apply and save. Material changes do not automatically invalidate existing grass maps — you will still need to rebuild them after wiring the output node.
Paint the Driving Layer
If the layer weight is never painted on the landscape, the mask is zero everywhere, and zero grass spawns. Switch to Landscape Paint mode, select the target layer (e.g. Grass), and paint across the terrain region where you want grass to appear. Be explicit: even if the layer appears selected in the Target Layers panel, it needs actual weight painted. A brand-new landscape has no weight data at all.
Verify your work visually by unchecking every other target layer’s visibility so only the grass layer is rendered. The painted area should be solid. If it is sparse or patchy, your grass will be sparse and patchy too — the density parameter on the Grass Type is multiplied by the layer weight, so 50% weight halves the final density.
Build Grass Maps
This is the step most people miss. In the main editor toolbar, open Build > Build Grass Maps. On large landscapes this can take a few minutes. The build samples the landscape material at a coarse grid and writes the result into cached texture data that the runtime spawner reads.
Until this build completes, grass may appear in the editor viewport (because the material graph runs on-the-fly for the editor) but be completely absent in PIE and packaged builds. If you are seeing editor-only grass, you have almost certainly skipped this step. A full Build All also generates grass maps, but Build Grass Maps is much faster if you only need to refresh them after a material or paint change.
Tune Density, Distances, and Streaming
Open your Landscape Grass Type asset. For each variety in the Grass Varieties array, check these fields:
- Grass Density: instances per 10m². Typical values are 400–1000 for dense grass. A value below 10 will look empty.
- Start Cull Distance / End Cull Distance: the range in Unreal units (cm) at which instances begin fading and finish fading. Defaults are often 10000/10000, which is 100m — too short for most outdoor worlds. For a meadow, try 8000 and 20000.
- Place in Shadow: if disabled, grass will not spawn under shadow-casting meshes. Leave it on unless you have a deliberate reason.
- Use Grid: controls whether placements snap to a grid. Disabling it gives a more natural distribution but costs slightly more memory.
Also check r.GrassCullDistanceScale and r.RT.EnableGrass via the console. On some scalability presets these are reduced automatically — test at Epic quality before assuming the assets are broken.
“Landscape grass is a pipeline, not a switch. Three things must all be true at once, and if any one of them is false, you get nothing — not a warning.”
Related Issues
If grass spawns but disappears at mid-range, see Foliage Disappearing at Distance for cull distance volumes and LOD culling. If your landscape material itself renders strangely on slopes, read Landscape Material Stretching on Slopes for triplanar setup that also affects where grass samples correctly.
Material node, painted layer, built maps. Miss one and the whole pipeline silently eats your grass.