Shadow - Ohio State University

Transcription

Shadow AlgorithmsCSE 781 Winter 2010Han-Wei Shen

Why Shadows? Makes 3D Graphics more believableProvides additional cues for the shapes andrelative positions of objects in 3D

What is shadow? Shadow: comparativedarkness given byshelter from direct light;patch of shadeprojected by a bodyintercepting light

Terminology(area) light sourceoccluder umbra – fully shadowed region penumbra – partially shadowed regionpenumbraumbrashadowreceiver

“Hard” and “Soft” Shadows Depends on the type of light sources Point or Directional (“Hard Shadows”, umbra)point directionalareaArea (“Soft Shadows”, umbra, penumbra),more difficult problem

“Hard” and “Soft” ShadowsHard shadowSoft shadow– point light source– area light source

Simple Approach: Ray tracing Cast ray to light(shadow rays)Surface point inshadow if the shadowrays hits an occluderobject.Ray tracing is slow, canwe do better? (perhapsat the cost of quality)

Shadow Algorithms We will first focus on hard shadows Planar ShadowsShadow MapsShadow Volume

Planar Shadows yThe simplest algorithm – shadowing occurswhen objects cast shadows on planarsurfaces (projection shadows)lightshadowy 0ylightshadown.x d 0

Planar Shadows Special case: the shadow receiver is an axisplane Just project all the polygon vertices to thatplane and form shadow polygonslightyvGiven:- Light position l- Plane position y 0- Vertex position vCalculate: pshadowpy 0

Planar Shadows We can use similar triangles to solve plpx-lxvx-lxlightyvpx shadowp lyly-vyly vx – lx vyly - vyy 0x Same principle applied to different axis planes

Planar Shadows How about arbitrary plane as the shadowreceiver?Plane equation: n.x d 0llightyorax by cz d 0where n (a,b,c) - plane normalvshadowpn.x d 0Again, given light position l , vFind p

Planar Shadows Finding pWe know: p l (v-l) x αAlso we know: n.p d 0Because p is on the planellightyWe can solve α easily:vshadowpn.x d 0d n.lp l -(v - l)n. (v – l)

Issues about planar shadows Shadow polygon generation (z fighting) Shadow polygons fall outside the receiver Using stencil buffer – draw receiver and update the stencilbufferShadows have to be rendered at each frame Add an offset to the shadow polygons (glPolygonOffset)Draw receivers first, turn z-test off, then draw the shadowpolygons. After this, draw the rest of the scene.Render into textureRestrictive to planar objects

Issues about planar shadows Anti-shadows and false shadowscorrectanti-shadowfalse shadow

Shadow Volumes A more general approach for receivers thathave arbitrary shapes

What is shadow volume? A volume of space formed by an occluderBounded by the edges of the occluderAny object inside the shadow volume is in shadowlight source

2D Cutaway of a ShadowVolumeShadowingobjectLightsourceEye position(note thatPartiallyshadows areshadowedindependent ofobjectthe eye position)Surface outsideshadow volume(illuminated)Shadowvolume(infinite extent)Surface insideshadow volume(shadowed)

In Shadow or not? Use shadow volume to perform such a testHow do we know an object is inside the shadowvolume?1.2.3.4.5.Allocate a counterCast a ray into the sceneIncrement the counter when the ray enter a front-facingpolygon of the shadow volume (enter the shadow volume)Decrement the counter when the ray crosses a backfacing polygon of the shadow volume (leave the shadowvolume)When we hit the object, check the counter. If counter 0 ; in shadow Otherwise - not in shadow

Counter for Shadow VolumeLightsourceShadowing objectzero 1zero 2Eyeposition 1 2 3In shadow

Real time shadow volume How can we render the idea of shadow volume inreal time? Use OpenGL Stencil buffer as the counterStencil buffer? Similar to color or depth buffer, except it’s meaning iscontrolled by application (and not visible)Part of OpenGL fragment operation – after alpha testbefore depth testControl whether a fragment is discarded or not Stencil function (Stencil test) - used to decide whetherto discard a fragment Stencil operation – decide how the stencil buffer isupdated as the result of the test

Stencil Function Comparison test between reference and stencil value GL NEVER always fails GL ALWAYS always passes GL LESS passes if reference value is less than stencil buffer GL LEQUAL passes if reference value is less than or equal to stencilbuffer GL EQUAL passes if reference value is equal to stencil buffer GL GEQUAL passes if reference value is greater than or equal tostencil buffer GL GREATER passes if reference value is greater than stencil buffer GL NOTEQUAL passes if reference value is not equal to stencil bufferIf the stencil test fails, the fragment is discarded and the stencil operationsassociated with the stencil test failing is applied to the stencil valueIf the stencil test passes, the depth test is applied If the depth test passes, the fragment continue through the graphicspipeline, and the stencil operation for stencil and depth test passing isapplied If the depth test fails, the stencil operation for stencil passing but depth

Stencil Operation Stencil Operation: Results of Operation on StencilValues GL KEEP stencil value unchangedGL ZERO stencil value set to zeroGL REPLACE stencil value replaced by stencil referencevalueGL INCR stencil value incrementedGL DECR stencil value decremented GL INVERT stencilvalue bitwise invertedRemember you can set different operations for Stencil failsStencil passes, depth failsStencil passes, depth passes

OpenGL for shadow volumes Z-pass approachZ-fail approachIdeas used by both of the algorithms are similar Z-pass: see whether the number of visible front-facingshadow volume polygons and the number of visible backfacing polygons are equal. If yes – objects are not in shadowZ-fail: see whether the number of invisible back-facingshadow volume polygons and the number of invisible frontfacing polygons are equal. If yes – objects are not in shadow

Z-pass approach Render visible scene with only ambient and emssion andupdate depth bufferTurn off depth and color write, turn on stencil (but still keep thedepth test on)Init. stencil bufferDraw shadow volume twice using face culling 1st pass: render front faces and increment stencil bufferwhen depth test passes 2nd pass: render back faces and decrement when depthtest passesstencil pixels ! 0 in shadow, 0 are litRender the scene again with diffuse and specular whenstencil pixels 0

Problems of Z-pass algorithm1. When the eye is in the shadow volume Counter 0 does not imply out of shadowanymoreIn this case, the stencil buffer should be init. withthe number of shadow volumes in which the eyeis in (instead 0)2. When the near plane intersects with theshadow volume faces (and thus will clip thefaces)

Z-pass algorithm problem illustrationlightneareyefarMistakenly determined as not in shadow

Z-fail approach Render visible scene to depth bufferTurn off depth and color, turn on stencilInit. stencil buffer given viewpointDraw shadow volume twice using face culling 1st pass: render back faces and increment whendepth test fails2nd pass: render front faces and decrement whendepth test failsstencil pixels ! 0 in shadow, 0 are lit

Problem of z-fail algorithm Shadow volume can penetrate the far planeDepth clamping Solution: depth clamping - close up the shadowvolume

Shadow Map Basic idea: objects that are not visible to thelight are in shadowHow to determine whether an object arevisible to the eye? Use z-buffer algorithm, but now the “eye” is light,i.e., the scene is rendered from light’s point ofviewThis particular z-buffer for the eye is calledshadow map

Shadow Map Algorithm illustration

Shadow Map Algorithm1.2.3.Render the scene using the light as thecamera and perform z-bufferingGenerate a light z buffer (called shadowmap)Render the scene using the regular camera,perform z-buffering, and run the followingsteps: (next slide)

Shadow Map Algorithm (cont’d)For each visible pixel with [x,y,z] in worldspace, perform a transformation to the lightspace (light as the eye) [x1,y1,z1]3.2 Compare z1 with z shadow map[x1,y1]3.1- If z1 z (closer to light), then the pixel inquestion is not in shadow; otherwise the pixel isshadowed

1st PassView from lightDepth Buffer (shadow map)

2nd PassVisible surface depth

2nd PassFinal ImageNon-green in shadow

Shadow map issues Shadow quality depends on Shadow map resolution – aliasing problemZ resolution – the shadow map is often stored inone channel of texture, which typically has only 8bits Some hardware has dedicated shadow map support,such as Xbox and GeForce3Self-shadow aliasing – caused by different samplepositions in the shadow map and the screen

Shadow map aliasing problem The shadow looks blocky – when one singleshadow map pixel covers several screenpixelsThis is a similar problem to texturemagnification Where bi-linear interpolation or nearest neighborare used in OpenGL

Percentage Closer Filtering Could average binary results of all depth mappixels coveredSoft anti-aliased shadows

Shadow Maps With GraphicsHardware Render scene using the light as a cameraRead depth buffer out and copy into a 2D texture. We now have a depth texture.Fragment’s position in light space can begenerated using eye-linear texture coordinategeneration specifically OpenGL’s GL EYE LINEAR texgenUsing light-space (x, y, z, w) to generate homogenous(s, t, r, q) texture coordinatesTransform the texture coodrinates

Real time soft shadowing Only area light sourcecan generate softshadowsWe can sample thearea light source atdifferent points andthen average theresultsMany research doneExample: Herf andHeckbert’s algorithm

Herf and Heckbert’s Basic Ideda Sample multiple points from the area lightFor each shadow receiver For each point light source Draw the receiver, shaded Project the environment onto the shadow receiver (draw inblack) Draw the projection result into the OpenGL accumulationbufferSave the accumulation buffer content into a textureDraw the shadow receiver using the texture

Project onto the shadow receiver Transform the pyramid formed by the lightand the receiver into a parallelepipedThe parallelepiped has x, y ranged from (0,0)to (1,1) and z from 1 to infinityEssentially the light is viewing the receiver,and a perspective projection is performedUse OpenGL to render the environmentbetween (0,0,1) and (1,1,infinity) in black

The projection setupa

The Projection MatrixRemember a is the point light source, b is one corner of the receiver parallelogramAnd ex ey are the two vectors for the parallelogram

Orthographic renderingmake projmatrix(M); // see the previous slide// OpenGL stuffglMatrixMode(GL PROJECTION);glLoadIdentity();glOrtho(0.0, 1.0, 0.0, 1.0, 0.999, 1000);glMultMatrixf(M);glMatrixMode(GL MODELVIEW); // render the scene

Increment the counter when the ray enter a front-facing polygon of the shadow volume (enter the shadow volume) 4. Decrement the counter when the ray crosses a back-facing polygon of the shadow volume (leave the shadow volume) 5. When we hit the object, check the counte