Description

Cascade index 0 is passed into GetViewDependentWholeSceneProjectedShadowInitializer. I think the intent of MaxShadowCascades = 1 and requesting cascade index 0 is to get a single bounding volume for the "does this primitive receive CSM shadows?" test. The problem is that GetSplitDistance with NumNearCascades = 1 returns WholeSceneDynamicShadowRadius for SplitIndex = 1 (the far edge). Far shadow cascades cover [WholeSceneDynamicShadowRadius, FarShadowDistance], which is completely outside this frustum. So any primitive that's beyond WholeSceneDynamicShadowRadius but within FarShadowDistance gets classified as a non-CSM receiver and gets the non-shadow shader.

Steps to Reproduce
  1. Start a new project with static lighting disabled.
  2. Set the mobile rendering path to Forward.
  3. In the Directional Light, set the max dynamic cascades to 1 and the distance to 5000, and the far cascades to 1 with a distance of 20000
  4. Place a box at 3000 units and 10,000 units from the camera
  5. Set "Far shadow" property on each Box
  6. Duplicate the floor mesh at scale 1.0 and put a copy under each of the cubes, to receive shadows
  7. Enable Android Vulkan High preview platform
  8. Enter the console command “r.Shadow.RadiusThreshold 0”
  9. Move the camera back and forth. There will be areas where the shadow on the more distant cube disappears.

Have Comments or More Details?

There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-371958 in the post.

0
Login to Vote

Cannot Reproduce
ComponentUE - Platform - Mobile
Target Fix41.00
CreatedMar 30, 2026
ResolvedMay 22, 2026
UpdatedMay 25, 2026
View Jira Issue