Skip to Content
DocumentationURP ModulesPCSS Shadow

PCSS Shadow

PCSS (Percentage-Closer Soft Shadows) replaces URP’s fixed-radius PCF with a screen-space filter that widens the penumbra as the occluder moves away from the receiver. A coin on a desk casts a crisp shadow; a tree branch high above the ground casts a soft one. The effect is physically motivated but exposed through artist-friendly sliders. PCSS is an optional module added through the Renderer Feature Installer.

Video

A tree casting shadows on the ground as the sun moves, the trunk's contact shadow staying crisp while the high branch shadows widen into soft penumbras the further they are from the ground.

modules/pcss-shadow/pcss-contact-hardening.mp4

Penumbras widening with occluder distance as the sun animates.

When to use it

  • Outdoor scenes with a strong directional light and varying occluder distances.
  • Stylized close-ups where shadow shape matters as much as material.
  • Cinematic shots where contact hardening sells the ground plane.

Uniform softness — branches and trunk share the same shadow blur radius.

Trunk shadows stay crisp at contact; branches feather to wide penumbras on the ground.

URP PCF
Genesis PCSS

Drag to compare URP PCF against the Genesis PCSS module.

How it works

PCSS runs in two stages. A blocker search samples the shadow map around each fragment to estimate the average occluder depth, then a filter pass scales the PCF kernel by (receiver − blocker) × LightSize. The result is a soft edge near the occluder and a wide one far away. The pass injects after the main shadow map pass and before opaques.

Renderer Feature setup

  1. Open Window → Genesis → Renderer Feature Installer.
  2. Tick PCSS Shadow and pick your URP Renderer asset.
  3. In the Renderer’s inspector, expand the Genesis PCSS feature.
  4. Choose a quality preset — Mobile, Balanced, or Cinematic.
  5. Enter Play mode and confirm the directional light’s shadows soften with distance.

Settings

Inspector labelShader propertyTypeDefaultDescription
Sample Count_SampleCountInt (8–64)16Filter samples per pixel. Higher is smoother and slower.
Blocker Samples_BlockerSamplesInt (4–32)8Blocker search taps. Drives contact-hardening accuracy.
Light Size_LightSizeFloat0.02Virtual sun size in world units. Larger widens penumbras far away.
Penumbra Limit_PenumbraLimitFloat1.0Max penumbra radius in pixels — clamps the worst-case blur.
Filter Radius_FilterRadiusFloat0.5Base softness applied to contact shadows.
Distance Fade_DistanceFadeFloat60World-space distance at which PCSS fades to standard PCF.

Performance & quality

  • Sample count is the biggest knob. 8 taps read as noisy without a temporal filter; 32+ is cinematic.
  • Blocker search can be reduced at distance without much visible loss, since PCSS already fades to PCF.
  • Pairs well with a screen-space temporal filter — Genesis applies a 1-frame blue-noise rotation by default to hide undersampling.

PCSS targets desktop and current-gen consoles. On mobile, prefer URP’s soft PCF or the Blob Shadow module — the blocker search is bandwidth-heavy.

Tips & gotchas

  • Single-pass instanced (VR): enable the VR-safe preset to avoid eye-to-eye flicker; it disables blue-noise jitter.
  • Cascade transitions can show seams. Increase Distance Fade to push PCSS off the far cascade.
  • Enable Soft Shadows on the directional light — PCSS replaces the soft filter rather than adding to it.
Last updated on