Quick answer: Wire your displacement into the Vertex Position output of the Master Stack. URP applies the vertex stage to all passes including ShadowCaster. If shadows still ignore the deformation, the displacement is in a custom function gated to a specific pass — remove the gate.

Wind sways your tree mesh. The shadow on the ground stays a perfect undisplaced silhouette. The mesh visibly leans left, the shadow stays straight up. The shadow pass is using the un-displaced vertices.

The Symptom

Vertex displacement (wind, water, dissolve, morph) renders correctly in Forward/GBuffer pass, but shadow cast on the ground is the static mesh shape. Shadow position and outline are wrong relative to the visibly displaced surface.

What Causes This

Shaders have multiple passes (Forward, ShadowCaster, DepthOnly, MotionVectors). Each pass has its own vertex computation. If your displacement is computed only in the Forward pass, the ShadowCaster runs the original vertex positions and the shadow stays static.

The Fix

Step 1: Use Master Stack Vertex Position. In Shader Graph (URP), the Vertex Position output of the Master Stack feeds every pass that runs the vertex stage, including ShadowCaster. As long as your displacement chain ends at this output, all passes get it.

Master Stack:
  Vertex
    Position:  [Position(Object) + DisplaceXYZ]
    Normal:    (recompute if needed)
    Tangent:   (recompute if needed)
  Fragment
    Base Color, Smoothness, ...

Step 2: Recompute normal. Displacement without normal recomputation causes lighting to look wrong. Compute the per-vertex normal numerically (sample displacement at three nearby positions, take cross product) or accept flat-look and pass the original normal.

Step 3: Custom Function pass safety. If your displacement uses a Custom Function node, ensure the include doesn’t gate the function to a specific pass. #ifdef SHADERGRAPH_PREVIEW guards are fine; #ifdef _MAIN_LIGHT_SHADOWS or pass-specific guards exclude shadow.

Older URP Versions

URP < 12 did not always run Shader Graph vertex stage in shadow casters. Upgrade to a current URP if possible. If stuck on an older version, the workaround is to write the shadow caster pass manually as a custom subshader pass and copy the displacement HLSL into it.

Tessellation Caveat

HDRP supports tessellation that further displaces. Tessellated displacement does run in the shadow caster but requires the ShadowCaster pass have tessellation enabled too. Toggle in the Master Stack settings → Surface Options.

Verifying

Drop a primary directional light. Place a flat ground plane. Place your mesh above it. Apply heavy displacement. Shadow on the ground should match the displaced silhouette in real time.

Frame Debugger → ShadowCaster pass → inspect the input vertex buffer; the values should match displaced positions, not original.

“Vertex Position in the Master Stack reaches every pass. No pass-specific guards. Shadows match the silhouette.”

Related Issues

For shaders not updating in build, see shader updates. For Time node frozen, see Time node.

Vertex Position propagates. Recompute normal. Shadows track.