## Presentation on theme: "Parallax-Interpolated Shadow Map Occlusion"— Presentation transcript:

Pismo Parallax-Interpolated Shadow Map Occlusion Ivan Neulander

Problem: Render soft shadows from an area light source Light source can be any polygonal model Want fast solution, of sufficient quality for visual effects Want speed vs. quality control Area Light Penumbra Umbra

Problem: Estimate shadow ray PL, extending from P to arbitrary point L on area light Use the 3 shadow maps rendered from the triangle vertices, all fixated on a common focal point F P L

Solution: 1) Compute position of putative occluder O Displace P toward L by distance d How to compute d ? P d O L

Solution: 2) Project O into screen space of Shadow Map #1 Use depth value at this pixel to compute ray occlusion Using O instead of P accounts for parallax shift between view from Shadow Map camera and view from L P d O L

Likewise, project O into screen space of Shadow Map #2 P d O L

Likewise, project O into screen space of Shadow Map #3 P d O L

Barycentrically blend the 3 shadow maps’ occlusion results to get the final occlusion estimate for the shadow ray PL Uses 3 shadow map queries per ray P d O L

Repeat the process for multiple shadow rays between P and other light positions on the area light P

Estimating Initial Depth d: Preprocess Shadow Maps
For each Shadow Map, we generate a Bled Shadow Map: an image-processed copy where we bleed out silhouette pixels apply a slight blur One-time preprocess per shadow map Regular Shadow Map stores multiple occluder depths per pixel (layered) Bled Shadow Map stores max depth only

Estimating Initial Depth d: Compute d1
Project P to a pixel in Bled Shadow Map #1 If queried depth is less than depth from P to L, subtract and we’re done; else, compute following average: Sample multiple jittered pixels in (layered) Shadow Map, centered about original pixel For each sample: If queried depth is less than depth from P to L, add difference to average Computed once per shading sample (not per ray) P d1 L

Estimating Initial Depth d: Compute d2
Project P to a pixel in Bled Shadow Map #2 Estimate value for d2 as above Computed once per shading sample P d2 L

Estimating Initial Depth d: Compute d3
Project P to a pixel in Bled Shadow Map #3 Estimate value for d3 as above Computed once per shading sample P d3 L

Estimating Initial Depth d: Blend d1, d2, d3
Barycentrically blend d1,d2,d3 to get d for given L Use blended d value to compute O as shown Computed per-ray (but no shadow map queries) P d L

Depth Compensation: Problem
Depth from L to P (LP) differs from depth from Shadow Map D to P (DP) Need to compensate depth estimates that use D in place of L P D DP LP L

Depth Compensation: Solution
Adjust initial estimates d1,d2,d3 by LP – DP Blend d1,d2,d3 and compute O Adjust depth queried from D (based on O) by LO – DO D (Shadow Map) F (Focal Point) L LO LP O P DO DP

Results: Area Light with 4 Shadow Maps
Pismo Off Pismo On 128 rays / pixel Area Light

Results: Area Light with 5 Shadow Maps
Pismo Off Pismo On 128 rays / pixel Area Light

Performance: Pismo vs. Ray Tracer
1600x1200 resolution 128 rays / pixel MHz Performance: Pismo vs. Ray Tracer 5 DMs: 33 s Final: 263 s Total: 296 s 5 DMs: 42 s Final: 246 s Total: 288 s Ray-Traced Total: 1073 s

Quality: Large Area Light

Quality: Pismo@4 vs. Ray Tracer
Pixel Difference Ray Tracer

Quality: Pismo@5 vs. Ray Tracer
Pixel Difference Ray Tracer

Quality: Pismo@9 vs. Ray Tracer
Pixel Difference Ray Tracer

Conclusions Pismo is a useful enhancement to rendering soft shadows with multiple shadow maps Conceptually simple & easy to implement integrates easily into an existing rendering pipeline Provides an intuitive control over speed/quality Creation of multiple shadow maps easily accelerated: Multiprocessing GPU rendering Morphing

Future Work Accelerate creation of shadow maps
Automate tessellation of light polygons Improve blending of contact shadows Parallelize Pismo sampling

Ivan Neulander