Chapter 10. Parallel-Split Shadow Maps on Programmable GPUs — Zhang, Sun, Nyman
- Source: https://developer.nvidia.com/gpugems/gpugems3/part-ii-light-and-shadows/chapter-10-parallel-split-shadow-maps-programmable-gpus
- Volume: GPU Gems 3
- Note: add-only excerpt for wiki ingest; images omitted; prose and key listings kept.
Summary of full chapter read
PSSM splits the view frustum with planes parallel to the view plane; each split gets an independent shadow map. Same idea as Engel's CSM / 3DMark cascaded shadows (Lloyd, Zhang, Tadamura lineage).
Aliasing decomposition
dp/ds ≈ perspective aliasing (dz/(z ds)) × projection aliasing (cos φ / cos θ). Perspective aliasing is scene-independent and addressable by warping/splitting; projection aliasing needs scene analysis.
Practical split scheme
Blend logarithmic (theoretically even perspective aliasing) and uniform splits: C_i = λ C_log_i + (1−λ) C_uni_i, default λ=0.5. Pure log oversamples near (tiny first splits); pure uniform undersamples near. Preprocess: tighten camera near/far to visible objects.
Light matrices
Scene-independent: AABB of split in light clip space, near z left at 0 so casters between light near and split still cast; crop matrix zooms light frustum. Scene-dependent: bound casters for near/xy and receivers for far; only receivers need depth compare at synthesize time.
Implementations
- Multipass: reuse one SM texture; render front-to-back with viewport depth range remapped so depth test stays valid.
- DX9: multiple SM textures; VS passes all light texcoords; PS picks split by view-space z.
- DX10: texture arrays + GS cloning or instancing to single-submit casters into all needed array slices; SampleCmpLevelZero with TextureCube for ≤6 splits PCF.
Optimizations
PCF/VSM filtering; pack into atlas; warp within splits; vary resolution per split; linear depth for point lights.