Potential of AI (Generative AI) in Business: Learnings and Insights
Robust Stenciled Shadow Volumes
1. Robust Stenciled Shadow Volumes
Cass Everitt & Mark J. Kilgard
Graphics/Visualization Seminar to the
Center for Computational Visualization
University of Texas
March 24, 2003
3. Shadow Volume Basics
Shadowing
object
Light
source Shadow
volume
(infinite extent)
A shadow volume is
simply the half-space defined
by a light source and a shadowing object.
4. Shadow Volume Basics (2)
Surface outside
shadow volume
(illuminated)
Simple rule:
samples within a
shadow volume
are in shadow.
Partially Surface inside
shadowed shadow volume
object (shadowed)
5. Visualizing Shadow Volumes in 3D
Occluders and light source cast out a shadow
volume
Objects within the volume should be shadowed
Light
source
Scene with shadows from an Visualization of the shadow
NVIDIA logo casting a shadow volume
volume
6. Shadow Volume Advantages
Omni-directional approach
Not just spotlight frustums as with shadow maps
Automatic self-shadowing
Everything can shadow everything, including self
Without shadow acne artifacts as with shadow maps
Window-space shadow determination
Shadows accurate to a pixel
Or sub-pixel if multisampling is available
Required stencil buffer broadly supported today
OpenGL support since version 1.0 (1991)
Direct3D support since DX6 (1998)
7. Shadow Volume Disadvantages
Ideal light sources only
Limited to local point and directional lights
No area light sources for soft shadows
Requires polygonal models with connectivity
Models must be closed (2-manifold)
Models must be free of non-planar polygons
Silhouette computations are required
Can burden CPU
Particularly for dynamic scenes
Inherently multi-pass algorithm
Consumes lots of GPU fill rate
8. Counting Enter/Leaves With a
Stencil Buffer (Zpass approach)
Render scene to initialize depth buffer
Depth values indicate the closest visible fragments
Use a stencil enter/leave counting approach
Draw shadow volume twice using face culling
1st pass: render front faces and increment when depth test
passes
2nd pass: render back faces and decrement when depth test
passes
Don’t update depth or color
Afterward, pixel’s stencil is non-zero if pixel in shadow,
and zero if illuminated
9. Visualizing the Stencil Buffer Counts
Shadowed scene Stencil buffer contents
Stencil counts
beyond 1 are
possible for
multiple or
complex
occluders.
red = stencil value of 1
green = stencil value of 0
GLUT shadowvol example credit: Tom McReynolds
12. Shadowed, Nested in Shadow Volumes
(Zpass)
Light Shadowing object
source
zero +1
zero
+ + + -
+2 +2 Shadowed
Eye +1 object
+3
position
Shadow Volume Count = +1+1+1-1 = 2
13. Illuminated, In Front of Shadow
Volumes (Zpass)
Light Shadowing object
source
zero +1
zero
+2 +2 Shadowed
Eye +1 object
+3
position
Shadow Volume Count = 0 (no depth tests pass)
14. Nested Shadow Volumes
Stencil Counts Beyond One
Shadowed scene Stencil buffer contents
green = stencil value of 0
red = stencil value of 1
darker reds = stencil value > 1
15. Animation of Stencil Buffer Updates
for a Single Light’s Shadow Volumes
Fully shaded scene
Final stencil state
Every frame is 5 additional stencil shadow volume
polygon updates. Note how various intermediate
stencil values do not reflect the final state.
16. Problem Created by
Near Clip Plane (Zpass)
Missed shadow volume
intersection due to near
clip plane clipping; leads
to mistaken count Far clip
plane
zero
+1
+1
+2
zero
+3
+2
Near clip
plane
17. Alternative Approach: Zfail
Render scene to initialize depth buffer
Depth values indicate the closest visible fragments
Use a stencil enter/leave counting approach
Draw shadow volume twice using face culling
1st pass: render back faces and increment when depth
test fails
2nd pass: render front faces and decrement when depth
test fails
Don’t update depth or color
Afterward, pixel’s stencil is non-zero if pixel in
shadow, and zero if illuminated
18. Illuminated,
Behind Shadow Volumes (Zfail)
Light Shadowing object
source
zero +1
zero
Unshadowed
object
+2 +2
Eye +1
+3
position
Shadow Volume Count = 0 (zero depth tests fail)
19. Shadowed, Nested in
Shadow Volumes (Zfail)
Light Shadowing object
source
zero +1
zero
+ +
+2 +2 Shadowed
Eye +1 object
+3
position
Shadow Volume Count = +1+1 = 2
20. Illuminated, In Front of Shadow
Volumes (Zfail)
Light Shadowing object
source
zero +1
zero
- - - + + +
+2 +2 Shadowed
Eye +1 object
+3
position
Shadow Volume Count = -1-1-1+1+1+1 = 0
21. Problem Created by
Far Clip Plane (Zfail)
Far clip
plane
Missed shadow volume
intersection due to far
clip plane clipping;
zero
leads to mistaken count
+1
zero
+1 +2
+2
+3
Near clip
plane
23. Avoiding Far Plane Clipping
Usual practice for perspective GL projection matrix
Use glFrustum (or gluPerspective)
Requires two values for near & far clip planes
Near plane’s distance from the eye
Far plane’s distance from the eye
Assumes a finite far plane distance
Alternative projection matrix
Still requires near plane’s distance from the eye
But assume far plane is at infinity
What is the limit of the projection matrix when
the far plane distance goes to infinity?
24. Standard glFrustum Projection Matrix
2 Near Right Left
0 0
Right Left Right Left
2 Near Top Bottom
0 0
P Top Bottom Top Bottom
Far Near 2 Far Near
0 0
Far Near Far Near
0 0 1 0
Only third row depends on Far and Near
25. Limit of glFrustum Matrix as
Far Plane is Moved to Infinity
2 Near Right Left
0 0
Right Left Right Left
2 Near Top Bottom
lim P Pinf 0 0
Far Top Bottom Top Bottom
0 0 1 2 Near
0 0 1 0
First, second, and fourth rows are the same as in P
But third row no longer depends on Far
Effectively, Far equals ∞
26. Verifying Pinf Will Not Clip
Infinitely Far Away Vertices (1)
What is the most distant possible vertex in front of the
eye?
Ok to use homogeneous coordinates
OpenGL convention looks down the negative Z axis
So most distant vertex is (0,0,-D,0) where D>0
Transform (0,0,-D,0) to window space
Is such a vertex clipped by Pinf?
No, it is not clipped, as explained on the next slide
27. Verifying Pinf Will Not Clip
Infinitely Far Away Vertices (2)
Transform eye-space (0,0,-D,0) to clip-space
2 Near Right Left
xc xc 0 0 0
Right Left Right Left
yc yc 2 Near Top Bottom 0
0 0
D zc Top Bottom Top Bottom D
D wc 0 0 1 2 Near 0
0 0 1 0
Then, assuming glDepthRange(0,1), transform clip-
space position to window-space position
zc D
zw 0.5 0.5 0.5 0.5 1
wc D
So ∞ in front of eye transforms to the maximum
window-space Z value, but is still within the valid
depth range (i.e., not clipped)
28. Robust Shadow Volumes sans Near (or
Far) Plane Capping
Use Zfail Stenciling Approach
Must render geometry to close shadow volume extrusion
on the model and at infinity (explained later)
Use the Pinf Projection Matrix
No worries about far plane clipping
Losses some depth buffer precision (but not much)
Draw the infinite vertices of the shadow volume using
homogeneous coordinates (w=0)
29. Rendering Closed, but Infinite,
Shadow Volumes
To be robust, the shadow volume geometry must be
closed, even at infinity
Three sets of polygons close the shadow volume
1. Possible silhouette edges extruded to infinity away from
the light
2. All of the occluder’s back-facing (w.r.t. the light) triangles
projected away from the light to infinity
3. All of the occluder’s front-facing (w.r.t. the light) triangles
We assume the object vertices and light position are
homogeneous coordinates, i.e. (x,y,z,w)
Where w 0
30. 1st Set of
Shadow Volume Polygons
Assuming
A and B are vertices of an occluder model’s possible
silhouette edge
And L is the light position
For all A and B on silhouette edges of the occluder
model, render the quad
B x , B y , B z , Bw
Ax , Ay , Az , Aw
Homogenous
Ax Lw Lx Aw , Ay Lw L y Aw , Az Lw Lz Aw ,0 vector differences
B x Lw L x B w , B y Lw L y B w , B z Lw Lz Bw ,0
What is a possible silhouette edge?
One polygon sharing an edge faces toward L
Other faces away from L
31. Examples of Possible Silhouette Edges
for Quake2 Models
An object viewed from the
same basic direction that
the light is shining on the
object has an identifiable
light-view silhouette
An object’s light-view
silhouette appears quite
jumbled when viewed form
a point-of-view that does
not correspond well with
the light’s point-of-view
32. 2nd and 3rd Set of
Shadow Volume Polygons
2nd set of polygons
Assuming A, B, and C are each vertices of occluder
model’s back-facing triangles w.r.t. light position L
These vertices are effectively directions (w=0)
Ax Lw Lx Aw , Ay Lw Ly Aw , Az Lw Lz Aw ,0
Homogenous vector
Bx Lw Lx Bw , B y Lw Ly Bw , Bz Lw Lz Bw ,0 differences
C x Lw Lx Cw , C y Lw Ly Cw , C z Lw Lz Cw ,0
3rd set of polygons
Assuming A, B, and C are each vertices of occluder
model’s front-facing triangles w.r.t. light position L
Ax , Ay , Az , Aw
Bx , By , Bz , Bw
C x , C y , C z , Cw
33. Complete Stenciled Shadow Volume
Rendering Technique
See our paper “Practical and Robust Stenciled Shadow
Volumes for Hardware-Accelerated Rendering”
In the accompanying course notes
And on-line at developer.nvidia.com
Paper has pseudo-code for rendering procedure
OpenGL state settings & rendering commands
Supports multiple per-vertex lights
Assumes application computes object-space
determination of occluder model’s polygons orientation
w.r.t. each light
34. Requirements for Our Stenciled Shadow
Volume Technique (1)
1. Models must be composed of triangles only (avoiding
non-planar polygons)
2. Models must be closed (2-manifold) and have a
consistent winding order
Bergeron [’86] approach could be used to handle “open”
models if necessary
3. Homogeneous object coordinates are permitted,
assuming w 0
If not, (x, y, z, -1) = (-x, -y, -z, 1)
4. Ideal light sources only
Directional or positional, assuming w 0
35. Requirements for Our Stenciled Shadow
Volume Technique (2)
5. Connectivity information for occluding models must
be available
So silhouette edges w.r.t. light positions can be
determined at shadow volume construction time
6. Projection matrix must be perspective
Not orthographic
NV_depth_clamp extension provides orthographic
support (more later)
7. Render must guarantee “watertight” rasterization
No double hitting pixels at shared polygon edges
No missed pixels at shared polygon edges
36. Requirements for Our Stenciled Shadow
Volume Technique (3)
8. Enough stencil bits
N stencil bits where 2N is greater than the maximum
shadow depth count ever encountered
Scene dependent
8-bits is usually quite adequate & what all recent stencil
hardware provides
Wrapping stencil increment/decrement operations (i.e.
OpenGL’s EXT_stencil_wrap) permit deeper shadow
counts, modulo aliasing with zero
Realize that shadow depths > 255 imply too
much fill rate for interactive applications
37. Requirements for Our Stenciled Shadow
Volume Technique (4)
9. Rendering features provided by OpenGL 1.0 or DirectX
6 (or subsequent versions)
Transformation & clipping of homogenous positions
Front- and back-face culling
Masking color and depth buffer writes
Depth buffering (i.e. conventional Z-buffering)
Stencil-testing support
In practice, these are quite reasonable
requirements for nearly any polygonal-based
3D game or application
38. Our Approach in Practice (1)
Scene with shadows. Same scene visualizing
Yellow light is embedded in the shadow volumes.
the green three-holed object.
Pinf is used for all the
following scenes.
39. Our Approach in Practice (2)
Details worth noting . . .
Fine details: Shadows Hard case: The shadow volume
of the A, N, and T letters on from the front-facing hole would
the knight’s armor and definitely intersect
shield. the near clip plane.
40. Our Approach in Practice (3)
Alternate view of same scene Shadow volumes from the
with shadows. Yellow lines alternate view.
indicate previous view’s view
frustum boundary. Recall
shadows are view-independent.
41. Our Approach in Practice (4)
Clip-space view. Original view’s Clip-space view of shadow
scene seen from clip space. The volumes. Back-facing triangles
back plane is “at infinity” with very w.r.t. light are seen projected
little effective depth precision near onto far plane at infinity.
infinity.
42. Another Example (1)
Original eye’s view. Again, Eye-space view of previous
yellow light is embedded in eye’s view. Clipped to the
the green three-holed previous eye’s Pinf view
object. Pinf is used for all frustum. Shows knight’s
the following scenes. projection to infinity.
43. Another Example (2)
Clip-space view of previous
eye’s view. Shows shadow
volume closed at infinity and
other shadow volume’s
intersection with the near clip
plane.
Original eye’s far Original eye’s near
clip plane clip plane
44. Stenciled Shadow Volumes &
Multiple Lights
Three colored lights.
Diffuse/specular bump
mapped animated
characters with
shadows. 34 fps on
GeForce4 Ti 4600;
80+ fps for one light.
45. Stenciled Shadow Volumes for
Simulating Soft Shadows
Cluster of 12 dim
lights approximating
an area light source.
Generates a soft
shadow effect; careful
about banding. 8 fps on
GeForce4 Ti 4600.
The cluster of
point lights.
46. Shadows in a Real Game Scene
Abducted game
images courtesy
Joe Riedel at
Contraband
Entertainment
48. Blow-up of Shadow Detail
Notice cable
shadows on
player model
Notice player’s
own shadow on
floor
49. Scene’s Shadow Volume
Geometric Complexity
Wireframe shows
geometric
complexity of
shadow volume
geometry
Shadow volume
geometry projects
away from the
light source
50. Visible Geometry vs.
Shadow Volume Geometry
<<
Visible geometry Shadow volume geometry
Typically, shadow volumes generate
considerably more pixel updates than
visible geometry
51. Other Example Scenes (1 of 2)
Visible geometry
Dramatic chase scene with shadows Shadow volume
geometry
Abducted game images courtesy
Joe Riedel at Contraband Entertainment
52. Other Example Scenes (2 of 2)
Visible geometry
Scene with multiple light sources Shadow volume
geometry
Abducted game images courtesy
Joe Riedel at Contraband Entertainment
53. Situations When
Shadow Volumes Are Too Expensive
Chain-link fence is
shadow volume
nightmare!
Chain-link fence’s
shadow appears on
truck & ground with
shadow maps
Fuel game image courtesy Nathan d’Obrenan at Firetoad Software
54. Shadow Volumes vs. Shadow Maps
Shadow mapping via projective texturing
The other prominent hardware-accelerated shadow
technique
Standard part of OpenGL 1.4
Shadow mapping advantages
Requires no explicit knowledge of object geometry
No 2-manifold requirements, etc.
View independent
Shadow mapping disadvantages
Sampling artifacts
Not omni-directional
55. Stenciled Shadow Volumes
Optimizations
Fill Rate Optimizations
Dynamic Zpass vs. Zfail determination
Bounds
Culling Optimizations
Portal-based culling
Occluder and cap culling
Silhouette Determination Optimizations
Efficient data structures for static occluder & dynamic
light
Cache shadow volumes, update only when necessary
Simplified occluder geometry
Shadow Volume Rendering Optimizations
Vertex programs for shadow volume rendering
Two-sided stencil testing
Directional lights
56. Shadow Volume History (1)
Invented by Frank Crow [’77]
Software rendering scan-line approach
Brotman and Badler [’84]
Software-based depth-buffered approach
Used lots of point lights to simulate soft shadows
Pixel-Planes [Fuchs, et. al. ’85] hardware
First hardware approach
Point within a volume, rather than ray intersection
Bergeron [’96] generalizations
Explains how to handle open models
And non-planar polygons
57. Shadow Volume History (2)
Fournier & Fussell [’88] theory
Provides theory for shadow volume counting approach within
a frame buffer
Akeley & Foran invent the stencil buffer
IRIS GL functionality, later made part of OpenGL 1.0
Patent filed in ’92
Heidmann [IRIS Universe article, ’91]
IRIS GL stencil buffer-based approach
Deifenbach’s thesis [’96]
Used stenciled volumes in multi-pass framework
58. Shadow Volume History (3)
Dietrich slides [March ’99] at GDC
Proposes Zfail based stenciled shadow volumes
Kilgard whitepaper [March ’99] at GDC
Invert approach for planar cut-outs
Bilodeau slides [May ’99] at Creative seminar
Proposes way around near plane clipping problems
Reverses depth test function to reverse stencil volume ray
intersection sense
Carmack [unpublished, early 2000]
First detailed discussion of the equivalence of
Zpass and Zfail stenciled shadow
volume methods
59. Shadow Volume History (4)
Kilgard [2001] at GDC and CEDEC Japan
Proposes Zpass capping scheme
Project back-facing (w.r.t. light) geometry to the near clip
plane for capping
Establishes near plane ledge for crack-free
near plane capping
Applies homogeneous coordinates (w=0) for
rendering infinite shadow volume geometry
Requires much CPU effort for capping
Not totally robust because CPU and GPU
computations will not match exactly,
resulting in cracks
60. Shadow Volume History (5) –
Our Contribution
Everitt & Kilgard [2002] Integrate Multiple Ideas into a robust
solution
Dietrich, Bilodeau, and Carmack’s Zfail approach
Kilgard’s homogeneous coordinates (w=0) for rendering infinite
shadow volume geometry
Somewhat-obscure [Blinn ’93] infinite far plane projection matrix
formulation
DirectX 6’s wrapping stencil increment & decrement
OpenGL’s EXT_stencil_wrap extension
NVIDIA Hardware Enhancements
Depth clamping [2001]: better depth precision
Two-sided stencil testing [2002]: performance
Depth/stencil-only hyper-rasterization: performance
Depth bounds test [2003]: culling support
61. The Future
Expect many games to have dynamic “everything
shadows everything” shadows
Expect hardware vendors to optimize hardware for
this technique
The “Doom3 effect”
Expect research to optimize shadow volume
culling/rendering/etc.
Other applications
Hardware-accelerated collision detection
Computational Geometry
Problems related to the visibility problem