3D Scatter Guide

Scatter grass, flowers, mushrooms, pebbles and custom meshes from reusable definitions that can target several Terrain Atlas biomes.

On a small screen, scroll wide tables sideways to read every column.

The 3D Scatter system places instanced meshes directly from Terrain Atlas biome data. A scatter object contains one reusable set of placement rules and mesh variants. Instead of rebuilding the same grass setup for every biome, add several Target Biomes to that one object and optionally give each target its own density multiplier.

Scatter is intended for repeated surface detail such as grass, flowers, mushrooms, stones and small props. It does not edit the terrain mesh, create colliders for every instance or turn scattered objects into individual GameObjects.

Understand the scatter library

Scatter authoring is global to the Terrain Atlas biome library rather than stored separately inside every biome inspector. Open the 3D Scatter section in the Vertex 3D Terrain window to create and edit the library.

PartIts jobImportant consequence
Scatter ObjectStores reusable placement rules, wind choice and one or more mesh variants.Configure grass once, then target several biomes instead of duplicating the whole setup.
Target BiomeAllows that scatter object to spawn where a selected Terrain Atlas biome contributes.Each target can have its own Density Multiplier from 0 to 2.
Mesh VariantChooses a built-in preset or custom mesh and its relative selection chance.Several variants can share the same placement rules.
Scatter SettingsControls seed, batching, distance, LOD transition, far density and safety budgets.These are shared by the scatter library rather than repeated on every object.
Active Terrain RendererConnects the profile to the selected terrain root and submits GPU-instanced draws.Instances are not represented by thousands of scene GameObjects.

Create your first scatter object

  1. Use the Terrain Atlas pipeline and make sure the terrain has painted biome data.
  2. Open 3D Scatter in the Vertex 3D Terrain window. If no profile exists, create the Scatter Library.
  3. Choose + Add Scatter Object and give it a clear name such as Meadow Grass.
  4. Under Target Biomes, choose one or more biomes from the current library.
  5. Start with Density Multiplier 1 on each target.
  6. Set the overall Density (clumps per square metre), Spacing, Coverage range, slope, scale and surface alignment.
  7. Add a Mesh Variant. Start with the built-in Grass preset or assign a Custom Mesh.
  8. Assign or confirm the material, enable GPU Instancing if prompted and use Rebuild Scatter after major changes if the preview has not already refreshed.

Example: create one Meadow Grass object, then target Lush Grass at ×1.0, Dry Meadow at ×0.65 and Forest Soil at ×0.25. The same grass mesh, colour ramp, roughness and wind setup is reused on all three surfaces.

Target several biomes from one setup

A scatter object can target any number of Terrain Atlas biomes. The biome picker shows the current biome name and numeric ID. Use + Add Target Biome to extend the list.

ControlMeaningExample
BiomeThe Terrain Atlas biome on which this scatter object is allowed to appear.Grassland, Forest Soil or another current library entry.
Density Multiplier: 0–2Multiplies the scatter object’s base density only for this target biome.1 uses normal density, 0.5 gives half as much, 0 disables that target, 2 allows twice as much.

At a painted blend, the system evaluates the combined contribution of the scatter object’s targeted biomes. A reusable object can therefore continue across a Grass/Forest boundary instead of requiring separate duplicate definitions.

Accepted instances retain an owning biome based on the contributing target at their position. This is what allows a single reusable grass object to react differently when a live biome modifier affects only one of its target biomes.

Placement controls

ControlMeaningUseful approach
Density: 0–100 clumps/m²Base expected instance density before Target Biome multipliers and live runtime density are applied.Start low, then increase while checking instance count and distant coverage.
Coverage Min / Max: 0–1Allows placement only where combined coverage of all Target Biomes falls within the selected range.Raise Min to reject faint blends. Lower Max below 1 to reject solid biome interiors. Max 1 preserves the usual interior placement.
SpacingMinimum world-space distance between clump centres for this scatter object, including across terrain tile boundaries. 0 leaves spacing unrestricted.Increase to reduce clumping and overlap. This can reduce the final instance count below Density. It measures centres, so large meshes can still overlap.
Max Slope: 0–90°Rejects surfaces steeper than the chosen slope.Grass often wants a lower limit than rocks or cliff debris.
Scale Min / MaxRandom uniform scale range for accepted instances.Use a restrained range for natural variation without obvious size jumps.
Alignment: 0–1Blends between the selected Up Mode and the terrain normal.0 keeps objects upright relative to the chosen up direction; 1 follows the surface normal fully.
OffsetMoves the instance along the sampled surface normal.Use a small positive or negative adjustment when a mesh appears to float or sink.
Enable WindOpts this scatter object into DPT Scatter Wind. The control is only available when the assigned shader supports the DPT Scatter Wind feature.Enable for compatible grass, flowers and other flexible meshes. Leave off for rigid props. VCCORE materials use their own authored wind data and do not need this option.

Place reeds only along a shoreline

  1. Create a Reeds scatter object and target Water only.
  2. Use a Coverage range such as 0.15–0.65 to allow reeds where Water blends into Mud, while excluding pure Water at 1.
  3. Adjust the painted transition width and range to position the band, then set Density and Spacing for the number and separation you want.

Coverage sums all targeted biomes. If you target both Water and Mud, their combined coverage can be 1 throughout that transition, so the same range will exclude it. Target only the biome whose partial coverage describes the edge you need. Coverage filters eligible surface; the per-biome Density Multiplier changes how many clumps appear there.

Built-in presets and custom meshes

Each scatter object can contain several Mesh Variants. Relative Chance is a relative selection weight, not a percentage that must add to 100. Use different Shape Seed values for variations of a built-in mesh without changing the placement seed. Preset descriptions are available as tooltips.

Built-in presetUseful forShape notes
Grass / Short Grass / Tall GrassMeadows, close ground cover and taller vegetation.Choose the silhouette for your scene; near and far geometry keep distant populations cheaper.
FlowersSmall flowering patches.Mix seeds and ramps for variation.
LavenderUpright purple flower spikes.Clustered flower geometry and few leaves keep the mesh simpler than many separate florets.
Ferns / Clover / ShrubsLeafy undergrowth and low bushes.Use scale and spacing to keep overlapping foliage under control.
ReedsWetland and shoreline planting.Smaller default stalks; combine with a coverage band and spacing.
PebblesSmall stone clusters.Use Smoothing Angle to choose smoother or faceted lighting.
MushroomsForest-floor detail.The colour ramp follows each generated element’s local height.
CrystalsFaceted mineral clusters.Smoothing Angle defaults to 0 for crisp faces and remains adjustable.
Fallen BranchesGround debris.Simplified attached twigs and a ground-oriented shape. Check alignment and offset on steep ground.

Shading and surface properties

All built-in presets, including Crystals, have Smoothing Angle: 0–180°. At 0 the faces stay flat; at 180 all adjoining faces can blend their normals. Intermediate values smooth gentle joins while keeping sharper edges. This changes lighting, not the mesh silhouette or terrain’s global Smooth / Sharp setting.

The Vertex Colour Ramp is evaluated from bottom to top locally for each generated element. Smoothness runs from rough at 0 to polished at 1 and defaults to 0.2 for new variants. Metallic controls their metallic response from 0 to 1.

Generated meshes pack Metallic into UV3.R. UV3.G contains the DPT packed scale/roughness value derived from Smoothness, rather than raw smoothness. A custom shader must decode this DPT mesh data to use it correctly.

Emissive scatter

Enable Emissive on a built-in variant, then use HDR colours in its ramp for brightness and ramp alpha for glow coverage. DPT packs that coverage into vertex alpha in the same way as emissive biomes. HDR colour alone does not enable emission. The material’s emission controls still apply; visible bloom depends on the scene’s post-processing, and emission does not create a light source.

Custom meshes

Choose Custom Mesh, assign a 3D Mesh, optional submesh index, Material and optional Distant Mesh. With no Distant Mesh, the near mesh is reused. Custom meshes retain their authored normals, vertex colours and UV3 surface data; the built-in shading, metallic, smoothness and emissive controls do not rewrite them. Enabling supported DPT Scatter Wind prepares a runtime copy with wind/biome data and leaves the source asset unchanged.

Material choice matters. Scatter uses GPU instancing. Use a material compatible with the mesh data and enable GPU Instancing when prompted. Leaving the variant material empty resolves the source terrain material where appropriate.

Distance, LOD and renderer settings

Expand Scatter Settings. Frequently used controls are grouped under Distance & LOD and Preview & Shadows. Open Advanced for Cell Size, Wind Bounds, per-tile budgets, Up Mode and Runtime Discovery. Placement settings use compact paired sliders, and scale ranges show Min/Max rather than X/Y.

SettingMeaningWhat to watch
SeedControls deterministic scatter placement.Change it when you want a different distribution without changing density rules.
Cell SizeWorld-space size used to group instances for culling and drawing.Very small cells increase group count; very large cells make distance/frustum culling less precise.
Draw DistanceStops submitting scatter beyond this camera distance.Set it for the actual game camera and scale of your scene.
LOD DistanceCentre of the near-to-far transition.Choose a distance where the mesh change is difficult to notice.
TransitionWidth of the smooth stochastic transition around LOD Distance.0 produces an immediate change; a wider value mixes near/far populations across a band.
Live CrossfadeOptionally fades individual instances as live biome Strength or Scatter Density changes, in both directions. Off by default.Enable under Distance & LOD. Requires a material with DPT scatter fade support; Static Scatter ignores live changes.
Fade Range: 0.01–1Controls the portion of the live density animation over which each instance fades. Defaults to 0.15.Increase for softer, longer fades. Timing follows the live animation; this value is not a duration in seconds. See Live Crossfade.
Far Density: 0–1Fraction of the population retained at full far distance.Lower it to thin distant scatter as well as switching to cheaper geometry.
Wind BoundsExtra world-space culling bounds for wind-enabled scatter.Raise it if strongly animated tips disappear while their original bounds leave the camera.
Instances / TileSafety cap for accepted instances on one terrain source.Raise only after checking memory and performance.
Candidates / TileSafety cap for attempted placement samples.A cap warning usually means density or terrain size deserves review before simply increasing the budget.

Up Mode and preview

Renderer controlUse
World UpOrdinary terrain using global +Y as the up direction.
Root UpRotated terrain where the terrain/root transform defines up.
RadialPlanetoids or spherical worlds where up points away from the selected centre/reference.
Up ReferenceOptional transform used by Root Up and Radial. The terrain root is used when no separate reference is supplied.
Scene PreviewShows scatter in edit mode.
Cast Shadows / Receive ShadowsControls the instanced draw’s shadows. New renderers default Cast Shadows to On; check existing renderers because their saved value is retained. Shadows can improve close-up shots but add rendering cost.
Animate PreviewContinuously refreshes Scene view for wind or animated materials. Disable for a static preview.
Runtime DiscoveryOff by default. Turn on for periodic discovery during play, or call DPT_ScatterRenderer.RefreshSources() after changing nested terrain hierarchies or LOD membership. Direct child changes refresh automatically.

Wind setup

DPT Scatter Wind has two levels of control. The material decides whether the wind feature is active in the shader, while Enable Wind on the Scatter Object decides whether that particular scatter object uses the DPT Scatter Wind path. The Scatter Object control is only available when the assigned shader declares the _DPT_SCATTER_WIND Boolean Keyword, which lets Vertex 3D Terrain recognise that the shader supports this feature.

Using the Vertex Terrain material

  1. Open the material’s Wind section and turn on Enable Wind.
  2. Set a modest Wind Strength.
  3. Set Height To Tip close to the object-space height of the scatter mesh so the base stays anchored and the tip can reach full movement.
  4. Choose the Compass Heading and Vertical Pitch.
  5. Back in the 3D Scatter section, turn on Enable Wind for each Scatter Object that should use DPT Scatter Wind.
  6. If strongly animated tips disappear near the camera or frustum boundary, increase Wind Bounds in Scatter Settings.

Rigid scatter such as pebbles can share the same material while leaving the Scatter Object’s Enable Wind option off.

VCCORE materials

VCCORE uses its own authored wind system, so the Scatter Object’s Enable Wind control is intentionally unavailable for VCCORE materials. This is expected. If wind was painted onto the model with Stylized Color Swapper & Material Optimizer, or the model came from a DPT pack with wind data already authored, no Scatter-specific wind setup is required. Use the VCCORE material’s own wind controls to enable or adjust that movement.

Add DPT Scatter Wind to your own Shader Graph

If your custom shader already has its own wind system, keep using that system. You only need the DPT setup below when you want a custom Shader Graph to use the same Scatter Wind feature as the Vertex Terrain shader.

Open SH_DPT_VCTerrain, copy the Scatter Wind block shown below and paste it into your own Shader Graph. Then add these Blackboard entries using the exact Reference names:

Blackboard entryTypeReference
Wind StrengthFloat_Wind_Strength
Wind DirectionVector 3_Wind_Direction
Height To TipFloat_Height_To_Tip
DPT Scatter WindBoolean Keyword_DPT_SCATTER_WIND
  1. Copy the complete Scatter Wind block from the supplied Vertex Terrain Shader Graph and paste it into your graph.
  2. Add the four Blackboard entries above if they do not already exist.
  3. Reconnect Wind Strength, Wind Direction, Height To Tip and DPT Scatter Wind exactly as shown in the reference image.
  4. Connect the final DPT Scatter Wind output to the graph’s Vertex Position input.
  5. Save the graph and assign a material that uses it to your Custom Mesh variant.
  6. Enable the DPT Scatter Wind keyword on that material, then enable Enable Wind on the Scatter Object.
Shader Graph reference showing the DPT Scatter Wind block, Blackboard properties and connection to the Vertex Position input.
Reference setup for adding DPT Scatter Wind to a custom Shader Graph. Copy the Scatter Wind block, recreate the four Blackboard entries with the exact Reference names above, reconnect them as shown and send the final output to Vertex Position.

Existing vertex animation: if your Shader Graph already modifies Vertex Position, integrate the copied Scatter Wind block with that existing object-space position instead of simply replacing your current deformation chain.

Live biome density and colour response

The same four Live Biome Modifier slots used by terrain surfaces can also control scatter belonging to their target biome IDs. This lets a seasonal system change the ground and the vegetation together.

Scatter Response controlMeaningNeutral value
Scatter Density: 0–1Multiplies how many already-generated instances are submitted for scatter owned by the targeted biome IDs.1. A value of 0 hides that biome’s scatter. Placement is retained during ordinary live changes; enable Live Crossfade to fade the changing population.
Colour MultiplierMultiplies the generated scatter colour for instances owned by the targeted biome IDs.White. HDR values can brighten as well as tint.

For example, a winter slot can increase snow dusting on a grass biome while reducing its Scatter Density and moving its Colour Multiplier toward a pale frosted colour. A reusable grass object can also target a forest biome; those forest-owned instances remain independent unless that biome ID is targeted by the live slot.

Seasonal example: leave summer Scatter Density at 1 and Colour Multiplier at white. At peak winter, try Density around 0.05–0.25 and a cool pale multiplier. The supplied Dynamic Biome Demo Controller contains an example winter animation that drives these values alongside dusting.

See Terrain Material Settings for the material controls and Demo & Runtime Guide for the example controller.

Fade scatter during live changes

  1. Open 3D Scatter → Scatter Settings → Distance & LOD.
  2. Enable Live Crossfade and start with Fade Range at its default of 0.15.
  3. Use a supplied DPT terrain shader with scatter fade support, then animate a live modifier’s Strength or Scatter Density.
  4. Adjust Fade Range while watching the transition. Larger values spread each instance’s fade over more of the density animation. Set the animation’s duration and easing in your controller.

Live Crossfade uses dithered visibility: each mesh and its shadow gradually lose or regain coverage as the live population changes. It works with both CPU and GPU scatter rendering and keeps the existing instance positions. At zero live density, the affected scatter and its shadows are fully hidden; reversing the animation fades them back in.

Choose which scatter responds. Enable Static Scatter on a Scatter Object when it should ignore live biome animation, including live density, colour and surface overrides. Static objects do not use Live Crossfade. Painting and sculpting still update their placement.

Materials without DPT scatter fade support keep their existing visibility behaviour. Changing the Scatter Object’s authored Density or rebuilding placement is separate from a live density animation. The Transition setting controls distance-based LOD changes, while Live Crossfade controls live biome changes.

Seasonal snapshots and collapsible profiles

Use the Dynamic Biome Demo Controller to capture material appearances as Environment Profiles. Edit the material, then choose + Capture Current Settings as NEW Profile. Each profile is a saved snapshot; later material edits are saved only when you capture again.

Click a profile’s arrow or name to collapse or expand it. The header keeps its name and sequence position visible, with the first profile marked START. Newly captured profiles open automatically. Expand a profile to edit Name, Transition Seconds, easing and Channels to Animate, or to use its capture, apply, reorder and remove controls. Animate To Profile blends the checked channels from the current appearance and then holds the result.

Snapshot changeWhen it applies
Live modifier Target BiomesThe destination profile’s target list applies at the start of the transition, including added, replaced or removed IDs. Strength, density, colours and other numeric values continue to animate. Unchecked modifier slots retain their current settings.
Dusting Biome ID with no starting dustingThe destination dusting ID applies at the start when the starting Dusting Strength is 0, dusting is disabled or the modifier slot is inactive. Dusting Strength then animates using the destination ID.
Dusting Biome ID with visible starting dustingWhen the starting slot is active with dusting enabled and nonzero strength, its existing dusting ID stays until the transition ends.

These rules apply to sequence playback, Edit Mode Preview/scrubbing and Animate To Profile. Each Live Biome Modifier slot supports up to three target biome IDs; this is separate from a Scatter Object’s Target Biomes list, which can contain any number of biomes.

Spring → winter → spring → heatwave: capture spring with water Dusting Strength at 0, winter with Ice dusting, a return to spring with strength back at 0, then heatwave with Sand dusting. The heatwave transition selects Sand immediately, so sand grows as strength rises instead of ice growing first and switching at the end. If the dry-season snapshot also targets an additional biome, that biome joins the live modifier from the start of the transition.

When painting dusting in Scene view, the red dusting preview is drawn before the brush handle, so the selected brush handle colour remains visible over the highlight.

Runtime scatter and baked terrain data

Scatter placement is generated synchronously on the main thread, then cached for rendering. A readable terrain mesh supplies its placement geometry directly. A non-readable terrain mesh can use a matching DPT_TerrainSurfaceData asset with baked scatter geometry instead, so terrain Read/Write does not need to stay enabled for this runtime path.

  1. Assign the scatter profile before baking.
  2. While the terrain is available for editor authoring, use Bake Surface Data. With a scatter profile assigned, it includes placement vertices, normals, triangles and biome channels as well as gameplay surface information.
  3. Keep the baked asset assigned to DPT_TerrainSurfaceTarget on each source terrain and include it in your build.
  4. Rebake after terrain geometry, painting, biome IDs or topology change. A gameplay-only or stale bake is not sufficient for scatter placement.
  5. Test the built scene with terrain Read/Write disabled. If the renderer requests a scatter geometry bake, supply current data or keep that source mesh readable.

The baked placement arrays consume memory; disabling terrain Read/Write does not eliminate the scatter data itself. Generating or rebuilding a large population can still take main-thread time. This terrain-data option does not remove authored custom mesh requirements, including readable mesh channels when preparing a DPT wind copy.

Performance and practical limits

Runtime Discovery is opt-in, so a stable terrain hierarchy does not need a full search every second during play. Built-in variant signatures are cached until the profile changes. Configured mesh caches retain meshes still used by active renderers and release obsolete entries after rebuilds; disabling the final renderer clears the shared scatter caches. Profile changes can still require regeneration.

Scatter problems

SymptomCheck in this order
No scatter appearsCheck Terrain Atlas mode, the Scatter Library, Target Biomes, base density, target Density Multiplier, Coverage Min/Max range, Maximum Slope, material and Scene Preview. Then use Rebuild Scatter.
Scatter appears on the wrong biomeCheck the current Target Biome names/IDs and whether the terrain was reordered after the setup. Remove duplicate or unintended targets.
A blend edge is too emptyCheck both ends of Coverage and the target Density Multipliers. Coverage sums all targeted biomes. For a shoreline band, target Water alone rather than Water and Mud together.
Clumps overlap too muchIncrease Spacing and check Scale Min/Max. Spacing separates centres within this scatter object, not the full outlines or separate scatter objects, and may reduce the final count.
Scatter appears in the middle of the lakeTarget Water alone and lower Coverage Max below 1. Paint a gradual Water/Mud transition where the reeds should grow.
Too much grass appears on one biomeLower that target’s Density Multiplier instead of duplicating the whole scatter object.
Custom mesh does not renderAssign the mesh/material, verify the submesh index and enable GPU Instancing. Check that the material is compatible with the custom mesh’s authored data.
Scatter pops at the LOD boundaryIncrease Transition and verify a suitable Distant Mesh or built-in distant preset exists. Also compare near/far silhouette and scale.
Scatter snaps out during a seasonal changeEnable Live Crossfade under Distance & LOD and adjust Fade Range. Use a material with DPT scatter fade support and check that Static Scatter is off for objects that should respond. Animate live Strength or Scatter Density rather than rebuilding authored placement.
The heatwave grows ice before switching to sandCapture the intervening spring profile with water Dusting Strength at 0, then capture the heatwave with Sand as its Dusting Biome ID. Zero-strength dusting adopts the new ID at the start; visible nonzero dusting retains its old ID until the end.
A newly targeted dry-season biome does not respondCapture the updated target list into the destination profile and check that its modifier slot is included under Channels to Animate. Destination target lists apply at the start; existing snapshots do not update automatically after material edits.
Profile controls appear to be missingClick the Environment Profile’s arrow or name to expand it. Collapsed profiles show their name and sequence position; editing and action controls are inside the foldout.
Visual Studio flags scatter instancing declarations, but Unity compilesUse the updated DPT scatter instancing include. It guards Unity-specific instancing macros and provides a fallback declaration for standalone HLSL editors. Check Unity’s Console separately for actual shader compilation errors.
Distant scatter is too denseLower Far Density or Draw Distance. Do not use the per-biome Target Density Multiplier solely as a distance control.
Enable Wind is greyed outThe assigned shader does not declare the _DPT_SCATTER_WIND Boolean Keyword, so the Scatter Object cannot use DPT Scatter Wind. Add the DPT Scatter Wind setup to your Shader Graph, or use the shader’s own wind system instead.
Enable Wind is greyed out on a VCCORE materialThis is intentional. VCCORE uses its own authored wind data and material wind controls, so no DPT Scatter Wind setup is required.
A custom DPT-compatible shader still does not moveCheck that the material’s DPT Scatter Wind keyword is enabled, the Scatter Object’s Enable Wind option is enabled, the Blackboard Reference names match exactly, the copied wind block is connected to Vertex Position, and Wind Strength / Height To Tip are set appropriately.
Wind moves the whole object strangelyCheck Enable Wind, Height To Tip, mesh object-space height and Wind Strength. Use the appropriate Up Mode for ordinary terrain, rotated terrain or a planetoid.
Wind tips disappear while movingRaise Wind Bounds so the draw bounds include the largest expected displacement.
A neutral live slot tints scatterWhite with HDR intensity 0 is neutral in all four slots, including Slot 1. Check overlapping slot targets, other colour multipliers and the shader’s scatter inputs. Dusting and scatter responses are separate paths.
HDR ramp colours do not glowEnable Emissive on the built-in variant, check ramp alpha and the material’s emission controls. Custom meshes need their own authored emission data.
Scatter disappears in a build with non-readable terrainAssign and rebake Surface Data with a scatter profile present. See runtime data setup; gameplay-only data does not contain placement geometry.
Snow changes the terrain but not the grassCheck that the scatter object targets the same biome ID as the live slot, Scatter Density/Colour Multiplier are not neutral, the live-biome master switch is on and the scatter renderer uses the same compatible material.
Changing Scatter Density has no immediate effectConfirm you are changing the live material Scatter Response, not only the profile’s authoring density. Profile density changes placement and may require a rebuild; live Scatter Density changes the submitted population.

Support

If you need help, include your Unity version, the Terrain Atlas biome IDs involved, a screenshot of the Scatter Object and Scatter Settings, the active material and the renderer status line. For placement problems, also mention terrain scale, density and whether the issue occurs on a pure biome or a blend.

Use the DPT Games contact form or join the DPT Games Discord.

Back to top