Shadow mapping

Shadow mapping

Shadow mapping or projective shadowing is a process by which shadows are added to 3D computer graphics. This concept was introduced by Lance Williams in 1978, in a paper entitled "Casting curved shadows on curved surfaces". Since then, it has been used both in pre-rendered scenes, in realtime, and even in many console and high-end PC games. Shadow mapping is used by Pixar's RenderMan, and likewise, shadow mapping has been used in such films as "Toy Story".

Shadows are created by testing whether a pixel is visible from the light source, by comparing it to a z-buffer or "depth" image of the light's view, stored in the form of a texture.

Principle of a shadow and a shadow map

If you looked out from a source of light, all of the objects you can see would appear in light. Anything behind those objects, however, would be in shadow. This is the basic principle used to create a shadow map. The light's view is rendered, storing the depth of every surface it sees (the shadow map). Next, the regular scene is rendered comparing the depth of every point drawn (as if it were being seen by the light, rather than the eye) to this depth map.

For real-time shadows, this technique is less accurate than shadow volumes, but the shadow map can sometimes be a faster alternative depending on how much fill time is required for either technique in a particular application. As well, shadow maps do not require the use of an additional stencil buffer, and can sometimes be modified to produce shadows with a soft edge. However, unlike shadow volumes, the accuracy of a shadow map is limited by its resolution.

Algorithm overview

Rendering a shadowed scene involves two major drawing steps. The first produces the shadow map itself, and the second applies it to the scene. Depending on the implementation (and number of lights), this may require two or more drawing passes.

Creating the shadow map

The first step renders the scene from the light's point of view. For a point light source, the view should be a perspective projection as wide as its desired angle of effect (it will be a sort of square spotlight). For directional light (e.g. that from the Sun), an orthographic projection should be used.

From this rendering, the depth buffer is extracted and saved. Because only the depth information is relevant, it is usual to avoid updating the color buffers and disable all lighting and texture calculations for this rendering, in order to save drawing time. This depth map is often stored as a texture in graphics memory.

This depth map must be updated any time there are changes to either the light or the objects in the scene, but can be reused in other situations, such as those where only the viewing camera moves. (If there are multiple lights, a separate depth map must be used for each light.)

In many implementations it is practical to render only a subset of the objects in the scene to the shadow map in order to save some of the time it takes to redraw the map. Also, a depth offset which shifts the objects away from the light may be applied to the shadow map rendering in an attempt to resolve stitching problems where the depth map value is close to the depth of a surface being drawn (i.e. the shadow casting surface) in the next step. Alternatively, culling front faces and only rendering the back of objects to the shadow map is sometimes used for a similar result.

hading the scene

The second step is to draw the scene from the usual camera viewpoint, applying the shadow map. This process has three major components, the first is to find the coordinates of the object as seen from the light, the second is the test which compares that coordinate against the depth map, and finally, once accomplished, the object must be drawn either in shadow or in light.

Light space coordinates

In order to test a point against the depth map, its position in the scene coordinates must be transformed into the equivalent position as seen by the light. This is accomplished by a matrix multiplication. The location of the object on the screen is determined by the usual coordinate transformation, but a second set of coordinates must be generated to locate the object in light space.

The matrix used to transform the world coordinates into the light's viewing coordinates is the same as the one used to render the shadow map in the first step (under OpenGL this is the product of the modelview and projection matrices). This will produce a set of homogeneous coordinates that need a perspective division ("see 3D projection") to become "normalized device coordinates", in which each component ("x", "y", or "z") falls between -1 and 1 (if it is visible from the light view). Many implementations (such as OpenGL and Direct3D) require an additional "scale and bias" matrix multiplication to map those -1 to 1 values to 0 to 1, which are more usual coordinates for depth map (texture map) lookup. This scaling can be done before the perspective division, and is easily folded into the previous transformation calculation by multiplying that matrix with the following:

egin{bmatrix}0.5 & 0 & 0 & 0.5 \0 & 0.5 & 0 & 0.5 \0 & 0 & 0.5 & 0.5 \0 & 0 & 0 & 1 end{bmatrix}

If done with a shader, or other graphics hardware extension, this transformation is usually applied at the vertex level, and the generated value is interpolated between other vertices, and passed to the fragment level.

Depth map test

Once the light-space coordinates are found, the "x" and "y" values usually correspond to a location in the depth map texture, and the "z" value corresponds to its associated depth, which can now be tested against the depth map.

If the "z" value is greater than the value stored in the depth map at the appropriate ("x","y") location, the object is considered to be behind an occluding object, and should be marked as a "failure", to be drawn in shadow by the drawing process. Otherwise it should be drawn lighted.

If the ("x","y") location falls outside the depth map, the programmer must either decide that the surface should be lit or shadowed by default (usually lit).

In a shader implementation, this test would be done at the fragment level. Also, care needs to be taken when selecting the type of texture map storage to be used by the hardware: if interpolation cannot be done, the shadow will appear to have a sharp jagged edge (an effect that can be reduced with greater shadow map resolution).

It is possible to modify the depth map test to produce shadows with a soft edge by using a range of values (based on the proximity to the edge of the shadow) rather than simply pass or fail.

The shadow mapping technique can also be modified to draw a texture onto the lit regions, simulating the effect of a projector. The picture above, captioned "visualization of the depth map projected onto the scene" is an example of such a process.

Drawing the scene

Drawing the scene with shadows can be done in several different ways. If programmable shaders are available, the depth map test may be performed by a fragment shader which simply draws the object in shadow or lighted depending on the result, drawing the scene in a single pass (after an initial earlier pass to generate the shadow map).

If shaders are not available, performing the depth map test must usually be implemented by some hardware extension (such as [http://www.opengl.org/registry/specs/ARB/shadow.txt "GL_ARB_shadow"] ), which usually do not allow a choice between two lighting models (lighted and shadowed), and necessitate more rendering passes:

#Render the entire scene in shadow. For the most common lighting models ("see Phong reflection model") this should technically be done using only the ambient component of the light, but this is usually adjusted to also include a dim diffuse light to keep curved surfaces from appearing flat in shadow.
#Enable the depth map test, and render the scene lit. Areas where the depth map test fails will not be overwritten, and remain shadowed.
#An additional pass may be used for each additional light, using additive blending to combine their effect with the lights already drawn. (Each of these passes requires an additional previous pass to generate the associated shadow map.)

The example pictures in this article used the OpenGL extension [http://www.opengl.org/registry/specs/ARB/shadow_ambient.txt "GL_ARB_shadow_ambient"] to accomplish the shadow map process in two passes.

ee also

* Shadow volume, another shadowing technique
* Ray casting, a slower technique often used in ray tracing
* Photon mapping, a much slower technique capable of very realistic lighting
* Radiosity, another very slow but very realistic technique

External links

* [http://developer.nvidia.com/attach/8456 Hardware Shadow Mapping] , nVidia
* [http://developer.nvidia.com/attach/6769 Shadow Mapping with Today's OpenGL Hardware] , nVidia
* [http://www.riemers.net/Tutorials/DirectX/Csharp3/index.php Riemer's step-by-step tutorial implementing Shadow Mapping with HLSL and DirectX]

Further reading

* [http://people.csail.mit.edu/ericchan/papers/smoothie/ Rendering Fake Soft Shadows with Smoothies] Eric Chan, Fredo Durand, Marco Corbetta
* [http://www.whdeboer.com/papers/smooth_penumbra_trans.pdf Smooth Penumbra Transitions with Shadow Maps] Willem H. de Boer
* [http://appsrv.cse.cuhk.edu.hk/~fzhang/pssm_project Parallel-Split Shadow Maps on Programmable GPUs] Fan Zhang, Hanqiu Sun, Oskari Nyman
* [http://www.comp.nus.edu.sg/~tants/tsm.html Anti-aliasing and Continuity with Trapezoidal Shadow Maps] Tobias Martin, Tiow-Seng Tan
* [http://www.cs.unc.edu/~zhangh/shadow.html Forward shadow mapping] does the shadow test in eye-space rather than light-space to keep texture access more sequential.


Wikimedia Foundation. 2010.

Игры ⚽ Нужна курсовая?

Look at other dictionaries:

  • Shadow Mapping — Szene mit Shadow mapping Szene ohne Schatten Shadow Mapping ist eine Methode der …   Deutsch Wikipedia

  • Shadow volume — Example of Carmack s stencil shadowing in Doom 3. Shadow volume is a technique used in 3D computer graphics to add shadows to a rendered scene. They were first proposed by Frank Crow in 1977[1] as the geometry describing the 3D shape of the… …   Wikipedia

  • Mapping — Der Begriff Mapping (zu deutsch Abbildung oder Kartierung, wörtlich eine Karte machen) hat in den letzten Jahrzehnten eine Reihe zusätzlicher Bedeutungen erhalten. Zum ursprünglichen Inhalt – ein begrenztes Gebiet kartografisch erfassen; erhobene …   Deutsch Wikipedia

  • Shadow and highlight enhancement — refers to an image processing technique to correct exposure. Images with over and under exposed areas can be recovered with the Shadow/Highlight tool in Photoshop. Though this tool can be used to darken overexposed highlights, it is used… …   Wikipedia

  • Projective texture mapping — is a method of texture mapping that allows a textured image to be projected onto a scene as if by a slide projector. Projective texture mapping is useful in a variety of lighting techniques and it s the starting point for shadow… …   Wikipedia

  • Photon mapping — In computer graphics, photon mapping is a two pass global illumination algorithm developed by Henrik Wann Jensen that solves the rendering equation. Rays from the light source and rays from the camera are traced independently until some… …   Wikipedia

  • S.T.A.L.K.E.R.: Shadow of Chernobyl — S.T.A.L.K.E.R. redirects here. For the prequel, see S.T.A.L.K.E.R.: Clear Sky. For the sequel, see S.T.A.L.K.E.R.: Call of Pripyat. S.T.A.L.K.E.R.: Shadow of Chernobyl The European cover art for S.T.A.L.K.E.R.: Shadow of Chernobyl …   Wikipedia

  • Cube mapping — The lower left image shows a scene with a viewpoint marked with a black dot. The upper image shows the net of the cube mapping as seen from that viewpoint, and the lower right image shows the cube superimposed on the original scene. In computer… …   Wikipedia

  • Tone mapping — is a technique used in image processing and computer graphics to map a set of colours to another; often to approximate the appearance of high dynamic range images in media with a more limited dynamic range. Print outs, CRT or LCD monitors, and… …   Wikipedia

  • O-r-mapping — Objektrelationale Abbildung (englisch object relational mapping, ORM) ist eine Technik der Softwareentwicklung, mit der ein in einer objektorientierten Programmiersprache geschriebenes Anwendungsprogramm seine Objekte in einer relationalen… …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”