9/20/2001CS 638, Fall 2001 Today Finishing Up Reflections More Multi-Pass Algorithms Shadows
9/20/2001CS 638, Fall 2001 Reflection Review Recall from last lecture: –Rendering reflections requires rendering what is seen in the mirror, and what is seen around the mirror –The stencil buffer is used to avoid writing over the reflection when rendering the regular view, or vice versa Last time we saw how to render the reflected view first: –Render the reflected view –Render the mirror, setting the stencil –Clear the color buffer to clear around the mirror –Render the stuff around the mirror, ignoring the stencil
9/20/2001CS 638, Fall 2001 Rendering Normal View First First pass: –Render the scene without the mirror Second pass: –Clear the stencil, Render the mirror, setting the stencil if the depth test passes Third pass: –Clear the depth buffer with the stencil active, passing things inside the mirror only –Reflect the world and draw using the stencil test. Only things seen in the mirror will be drawn
9/20/2001CS 638, Fall 2001 Normal First Addendum Same problem with objects behind mirror –Same solution Can manage multiple mirrors –Render normal view, then do other passes for each mirror –Only works for non-overlapping mirrors (in view) –But, could be extended with more tests and passes A recursive formulation exists for mirrors that see other mirrors
9/20/2001CS 638, Fall 2001 Frame Buffer Blending When a fragment gets to the frame buffer, it is blended with the existing pixel, and the result goes in the buffer Blending is of the form: –s=source fragment, d = destination buffer, RGBA color –In words: You get to specify how much of the fragment to take, and how much of the destination, and you add the pieces together All done per-channel
9/20/2001CS 638, Fall 2001 Blending Factors The default is: S rgba =(1,1,1,1), D rgba =(0,0,0,0) –Overwrite buffer contents with incoming fragment You can use the colors themselves as blending functions: eg S rgba =(R d,R g,R b,R a ), D rgba =(0,0,0,0) –What use is this? –Hint: What if there is an image in the buffer and the source is a constant gray image? A light map? Common is to use the source alpha: –S rgba =(A s,A s,A s,A s ), D rgba =(1-A s,1-A s,1-A s,1-A s ) –What does this achieve? When might you use it? Note that blending can simulate multi-texturing with multi-pass
9/20/2001CS 638, Fall 2001 Accumulation Buffer The accumulation buffer is not available for writing directly It is more like a place to hold and compute on pixel data Operations: –Load the contents of a color buffer into the accumulation buffer –Accumulate the contents of a color buffer, which means multiply them by a value then add them into the buffer –Return the buffer contents to a color buffer (scaled by a constant) –Add or multiply all pixel values by a given constant It would appear that it is too slow for games –That is, I don’t know of games that use it
9/20/2001CS 638, Fall 2001 Accum. Buffer Algorithms Anti-aliasing: Render multiple frames with the image plane jittered slightly, and add them together –Hardware now does this for you, but this would be higher quality Motion blur: Render multiple frames representing samples in time, and add them together –More like strobing the object Depth of field: Render multiple frames moving both the viewpoint and the image plane in concert –Keep a point – the focal point – fixed in the image plane while things in front and behind appear to shift
9/20/2001CS 638, Fall 2001 Why Shadows? Shadows tell us about the relative locations and motions of objects
9/20/2001CS 638, Fall 2001 Shadows and Motion Example movies came from:
9/20/2001CS 638, Fall 2001 Facts about Shadows Shadows can be considered as areas hidden from the light source –Suggests the use of hidden surface algorithms A shadow on A due to B can be found by projecting B onto A with the light as the center of projection –Suggests the use of projection transformations For scenes with static lights and geometry, the shadows are fixed –Can pre-process such cases –Cost is in moving lights or objects Point lights have hard edges, and area lights have soft edges
9/20/2001CS 638, Fall 2001 Ground Plane Shadows Shadows cast by point light sources onto planes are an important case that is relatively easy to compute –Shadows cast by objects (cars, players) onto the ground Accurate if shadows don’t overlap –Can be fixed, but not well (x p,y p,z p ) (x sw,y sw,z sw ) L(directional light)
9/20/2001CS 638, Fall 2001 Ground Shadow Math The shadow point lies on the line from the light through the vertex: The shadow is on the ground, z sw =0, so =z p /z l, giving: Matrix form:
9/20/2001CS 638, Fall 2001 Drawing the Shadow We now have a matrix that transforms an object into its shadow Drawing the shadow: –Draw the polygon –Multiply the shadow matrix into the model transformation –Redraw the object in gray with blending on Tricks: –Lift the shadow a little off the plane to avoid z-buffer quantization errors (can be done with extra term in matrix) –Works for other planes by transforming into plane space, then shadow, then back again –Take care with vertex ordering for the shadow (it reverses)
9/20/2001CS 638, Fall 2001 Point Light Shadows Blinn ’88 gives a matrix that works for local point light sources –Takes advantage of perspective transformation (and homogeneous coordinates) Book has an approximation that does not use perspective matrices, Chapter 5.7
9/20/2001CS 638, Fall 2001 Shadows in Light Maps Static shadows can be incorporated into light maps –When creating the map, test for shadows by ray-casting to the light source - quite efficient Area light sources should cast soft shadows –Interpolating the texture will give soft shadows, but not good ones, and you loose hard shadows –Sampling the light will give better results: Cast multiply rays to different points on the area light, and average the results –Should still filter for best results
9/20/2001CS 638, Fall 2001 Soft Shadow Example From Watt and Policarpo
9/20/2001CS 638, Fall 2001 Shadow Shape Perception Perceptual studies (or anecdotal evidence) suggests that the shape of a shadow is not important –In other words, people correctly associate shadows with the objects that cast them even if the shapes don’t correspond Movie with incorrect shadows from
9/20/2001CS 638, Fall 2001 Quick Dirty Shadows Blend a dark polygon into the frame-buffer in the place where the shadow should be –Cast a ray from light source, through object center, and see where it hits something –Blend a fixed shape polygon in at that location (with depth) Why dirty? –Use a fixed shape - shadow won’t match object –Use a single ray-cast to determine shadow location - no partial shadow and wrong parts of shadow may be drawn Good for things like car games for under-car shadow –Fast action and near planar receiving surfaces
9/20/2001CS 638, Fall 2001 Drawing Quick Dirty Shadows Z equal with hit polygon Z-buffer quantization errors Z above hit polygon Apparent shadow too big ViewerLight
9/20/2001CS 638, Fall 2001 Drawing Quick Dirty Shadows No depth test –Check that shadow can be seen by viewer (cast ray) –Just blend polygon in Again, shadow is too large and may be in wrong place –Test corners of shadow for visibility? –OK if polygons are flatter
9/20/2001CS 638, Fall 2001 Projective Shadows Create a texture that is the shape of the shadowing object as seen by the light Project this texture onto the other objects –That is, find texture coordinates on the other objects that pull the right shadow/non-shadow pixel out of the texture Read Chapter 5.8 of “Game Programming Gems” –I expect you to know how it works, but not the formulas –Note, it doesn’t mention the texture matrix, which can avoid the need to explicitly compute texture coordinates for objects Problem: Texture appears in places it shouldn’t, and it’s hard to avoid it