Fast Cascade VSM
By Zhang Jian
Dynamic Shadow TechShadow Volume Shadow MapBasic Algorithm
PCF VSM CSM ESM
Per Object Shadow Deferred Shadow
Soft Shadow
Rendering Stage
Cascade Selection
Perspective Alias PSM LiPSM TSM CSM
PSSM 2D CSM 3D CSM
Outline1.Basic Shadow Map and problems
2.Variance Shadow Map
3.Cascade Shadow Map In Our Engine
4.Shadow Mask
1. Shadow Map• Basic Idea: If a light can see a point, the
point will be lit by the light.
1. Shadow Map
3. Done!
1.Render a texture by using light as a camera, that’s shadow map, the pixel value is depth value.
2. Transform the current position into shadow map space (light space), test if it’s occluded by corresponding shadow map pixel.
?
1.Shadow Map
Peter panning
Perspective Alias
1. Shadow Map
Peter panning
Self-shadow Acne
1.Shadow Map
Peter Panning
1.Shadow Map
Hard Edge
1. Shadow MapDynamic Alias:
• Unstable resolution( PSM)• Edge swimming effect
2.Variance Shadow Map
Soft Shadow
2.Variance Shadow Map• Probability theory• dr is the current receiver depth• d0 is the random variable to represent
the occluder depth.
ror dddf Pr)(Our goal : define some states between shadow and lit.
2.Variance Shadow Map• Chebyshev’s inequality (when dr >
μ)
22
2
max)Pr(r
rro ddpdd
odE
222oo dEdE
2.Variance Shadow Map• Understand VSM by your way.
float d = ( vLightSpacePos.z ) - Depth;float p_Shadow = 1;if (d > 0) { float variance = ( DepthSquare ) - ( Depth * Depth );
p_Shadow = variance / ( variance + d*d );}
VSM In Our Engine• Render Z and Z2 into a 2 channels render target
– G16R16 ( hardware filter, 1 cycle)– 4x MSAA on Xenon ( Free, No predict-tilling)– RGBA8 on PC ( may provide multiple
solutions for difference GPU)• Prefilter: 2 pass Gaussian blur• Generate Mipmaps on Xenon.• VSM shadow testing.
2.Variance Shadow Map
• The good:– Very cheap Soft shadow: Support Pre-
filter, Blur == PCF.– Much Better self shadow quality ( solve
the shadow bias perfectly) – The ability to use high quality texture
filter( trilinear, anistropic filter)
2.Variance Shadow Map• The Bad: Light leaking.
2.Variance Shadow Map
• Light leaking.– Reduce Geometry complexity, use Low
Lod for shadow caster.– Tune parameters.(remapping the result)
3. Cascaded Shadow Map
Resolution problem
Cascaded Shadow Map
Cacade Alignment
Parallel Split Shadow Map
2D CSM
Z precision problem
3D CSM
Cacade Coverage Optimization
Cacade Transition
Interlace updating
4. Shadow Mask
Just an optimization
4.Shadow Mask
Shadow Mask
• Why?– Shadow calculation can increase shader
complexity a lot.– For most case, it can avoid overdraw.
• More aggressive, Postprocess shadow multiply
Shadow solution
Result• Memory: ~5M( 3M Vsm + 2M shadow mask)• Performance(ShadowMap+shadowMask):
– 4 cascade: 2.3-4.5 ms– 3 cascade: 1.7-3.5 ms– 2 cascade: 1.4-2.5 ms– 1 cascade: 1.0~2.0 ms
Future Works
• Optimization– Special Mesh LOD for shadow.– Unshadow sky Early out.– Shader optimization– Transparency shadow (e.g.. Smoke shadow)
Q&A
Declaration • This is from one of my internal presentations. I
implemented the shadow tech in our game engine, and shared tips and explanations here. It’s not an official paper, So I don’t have a reference docs list here,