Skip to content

Commit

Permalink
Implement percentage-closer soft shadows (PCSS).
Browse files Browse the repository at this point in the history
[*Percentage-closer soft shadows*] are a technique from 2004 that allow
shadows to become blurrier farther from the objects that cast them. It
works by introducing a *blocker search* step that runs before the normal
shadow map sampling. The blocker search step detects the difference
between the depth of the fragment being rasterized and the depth of the
nearby samples in the depth buffer. Larger depth differences result in a
larger penumbra and therefore a blurrier shadow.

To enable PCSS, fill in the `soft_shadow_size` value in
`DirectionalLight` or `PointLight`. This shadow size value represents
the size of the light and should be tuned as appropriate for your scene.
Higher values result in a wider penumbra (i.e. blurrier shadows).

When using PCSS, temporal shadow maps
(`ShadowFilteringMethod::Temporal`) are recommended. If you don't use
`ShadowFilteringMethod::Temporal` and instead use
`ShadowFilteringMethod::Gaussian`, Bevy will use the same technique as
`Temporal`, but the result won't vary over time. This produces a rather
noisy result. Doing better would likely require downsampling the shadow
map, which would be complex and slower (and would require PR bevyengine#13003 to
land first).

A new example, `pcss`, has been added. It demonstrates the
percentage-closer soft shadow technique with directional lights, point
lights, non-temporal operation, and temporal operation. The assets are
my original work.

Fixes bevyengine#3631.

[*Percentage-closer soft shadows*]:
https://developer.download.nvidia.com/shaderlibrary/docs/shadow_PCSS.pdf
  • Loading branch information
pcwalton committed May 22, 2024
1 parent c4cedb1 commit 00ef49d
Show file tree
Hide file tree
Showing 12 changed files with 1,499 additions and 117 deletions.
11 changes: 11 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3059,6 +3059,17 @@ description = "Demonstrates volumetric fog and lighting"
category = "3D Rendering"
wasm = true

[[example]]
name = "pcss"
path = "examples/3d/pcss.rs"
doc-scrape-examples = true

[package.metadata.example.pcss]
name = "Percentage-closer soft shadows"
description = "Demonstrates percentage-closer soft shadows (PCSS)"
category = "3D Rendering"
wasm = true

[profile.wasm-release]
inherits = "release"
opt-level = "z"
Expand Down
Binary file added assets/models/PalmTree/PalmTree.bin
Binary file not shown.
Loading

0 comments on commit 00ef49d

Please sign in to comment.