WPO movement is sharply cut at the edges of movement, causing visual glitches (Glitch1.mp4)
When changing camera views, the shadow gets cached and remains in an incorrect state (Glitch2.mp4)
I’ve been able to reproduce both with simple starter content shape and very simple WPO material, see attached project or recordings.
Both those issues do not occur with “r.Shadow.Virtual.Cache 0”
“Max World Position Offset Displacement” in the material is set to 0, so that no additional clamping occurs which could cause the issues. This is the default value.
Thanks for providing the detailed repro steps and project, that was very helpful.
The issue is caused by how Virtual Shadow Maps (VSM) handle World Position Offset (WPO) deformation in combination with page-based caching.
VSM use a cached, page-based system. When caching is enabled, shadow updates rely on the primitive’s bounds to determine which pages need invalidation and redraw. WPO modifies vertex positions in the shader stage only, so the mesh’s primitive bounds remain unchanged.
When WPO pushes geometry beyond its original bounds, the engine does not automatically expand the primitive bounds to account for that displacement. As a result, shadow cache pages may not be invalidated correctly or shadow can become clipped at the primitive’s cached bounds. A visible hard cutoff appears at the displacement edges.
Additionally, when changing camera views, the system assumes the geometry has not changed, and VSM does not invalidate the relevant cached pages, so the stale shadow data persists.
Even if “Max World Position Offset Displacement” is set to 0, this does not inform the shadow cache about dynamic displacement ranges. That setting only disables internal WPO clamping, it does not affect shadow cache invalidation.
A practical workaround is to manually expand the mesh bounds. On the mesh component, increase the Bounds Scale (for example, to 2.0 or higher depending on the displacement amplitude).
[Image Removed]
Expanding the bounds ensures that VSM properly invalidates and updates the relevant cached pages, preventing shadow clipping.
I hope this clarifies this case. Please let me know if you have any further questions.