青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Shadow mapping

http://en.wikipedia.org/wiki/Shadow_map

From Wikipedia, the free encyclopedia

  (Redirected from Shadow map)
Jump to: navigation, search
Scene with shadow mapping
Scene with no shadows

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.

Contents

[hide]

[edit] 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.

[edit] 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.

[edit] Creating the shadow map

Scene rendered from the light view.
Scene from the light view, depth 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.

[edit] Shading 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.

[edit] Light space coordinates

Visualization of the depth map projected onto the scene

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:

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.

[edit] Depth map test

Depth map test failures.

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.

[edit] Drawing the scene

Final scene, rendered with ambient shadows.

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 GL_ARB_shadow), which usually do not allow a choice between two lighting models (lighted and shadowed), and necessitate more rendering passes:

  1. 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.
  2. Enable the depth map test, and render the scene lit. Areas where the depth map test fails will not be overwritten, and remain shadowed.
  3. 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 GL_ARB_shadow_ambient to accomplish the shadow map process in two passes.

[edit] See also

[edit] External links

[edit] Further reading

posted on 2008-12-22 14:49 zmj 閱讀(1517) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一本视频| 麻豆精品传媒视频| 久久精品免费| 欧美在线观看一二区| 亚洲免费电影在线| 亚洲国产精品久久久久久女王| 国产午夜亚洲精品羞羞网站| 国产精品一区在线观看你懂的| 国产欧美精品一区| 亚洲电影下载| 日韩视频在线永久播放| 亚洲一区二区精品| 欧美一区二区三区在线视频 | 女女同性精品视频| 欧美高清一区| 一区二区三区精品在线| 午夜亚洲福利| 欧美成人精品激情在线观看| 国产精品久久久久国产a级| 国内免费精品永久在线视频| 久久久久一区二区| 欧美日韩美女在线| 激情婷婷欧美| 亚洲午夜未删减在线观看| 久久人人97超碰国产公开结果 | 国产精品一区久久久| 亚洲免费观看| 性做久久久久久| 亚洲美女av黄| 91久久黄色| 久久9热精品视频| 欧美gay视频| 亚洲欧美精品一区| 欧美福利电影网| 国产午夜精品麻豆| 99国产精品自拍| 久久婷婷久久| 亚洲综合色丁香婷婷六月图片| 欧美不卡高清| 在线视频国内自拍亚洲视频| 先锋亚洲精品| 99精品视频免费观看视频| 久久婷婷国产综合精品青草| 国产精品日韩一区| 亚洲视频 欧洲视频| 免费看精品久久片| 香蕉成人伊视频在线观看| 欧美日韩亚洲网| 久久久久久日产精品| 国产伦精品一区二区三区视频孕妇 | 性欧美8khd高清极品| 亚洲精品久久| 久久精品夜色噜噜亚洲a∨| 国产麻豆精品在线观看| 亚洲视频一区二区| 国产女主播在线一区二区| 欧美日韩免费观看一区三区| 亚洲人成亚洲人成在线观看| 免费成人激情视频| 久久亚洲国产精品一区二区| 在线看国产日韩| 欧美激情久久久久| 亚洲韩国日本中文字幕| 91久久香蕉国产日韩欧美9色| 亚洲一级高清| 国产精品久久久久久一区二区三区 | 国产日韩欧美91| 午夜激情久久久| 亚洲小说欧美另类社区| 国产精品拍天天在线| 午夜一级在线看亚洲| 亚洲欧美综合国产精品一区| 国产精品一区二区你懂得| 欧美亚洲在线播放| 性久久久久久久久久久久| 国内精品久久久久影院优| 美女视频黄 久久| 久久成人精品无人区| 国产精品v欧美精品v日本精品动漫| 亚洲午夜成aⅴ人片| 亚洲欧美一区二区三区在线| 在线亚洲欧美专区二区| 国产亚洲精品久久久久久| 久久综合精品国产一区二区三区| 久久精品视频在线播放| 亚洲国产日韩欧美在线图片| 亚洲精选视频免费看| 国产精品系列在线| 久久免费少妇高潮久久精品99| 美女主播精品视频一二三四| 欧美不卡福利| 欧美激情一区二区在线| 亚洲综合社区| 久久久久国产精品午夜一区| 99亚洲一区二区| 午夜国产精品影院在线观看 | 久久一二三国产| 一本色道久久88亚洲综合88| 亚洲欧美变态国产另类| 亚洲成色777777在线观看影院| 亚洲精品网站在线播放gif| 国产亚洲日本欧美韩国| 亚洲人成小说网站色在线| 国产精品久久久久久久9999| 欧美大片第1页| 国产精品揄拍500视频| 亚洲国产日韩一级| 亚洲欧美国产高清va在线播| 亚洲福利视频三区| 久久不射网站| 亚洲人成毛片在线播放| 亚洲一级二级| 一区二区三区不卡视频在线观看 | 在线免费观看欧美| 欧美日韩国产二区| 欧美一区二区三区精品电影| 欧美高清视频一区二区| 久久综合网络一区二区| 国产精品久久看| 亚洲福利专区| 狠狠噜噜久久| 销魂美女一区二区三区视频在线| 一区二区三区精品视频在线观看| 久久午夜视频| 免费在线成人av| 精品91久久久久| 久久av资源网| 久久久夜夜夜| 精品999网站| 久久精品国产99国产精品澳门| 欧美在线观看视频一区二区三区| 欧美午夜理伦三级在线观看| 日韩五码在线| 在线亚洲欧美专区二区| 欧美精品免费观看二区| 亚洲国产另类精品专区| 久久全球大尺度高清视频| 久久久久久久久久久久久女国产乱| 国产精品午夜春色av| 午夜电影亚洲| 久久综合色婷婷| 在线观看不卡av| 牛牛国产精品| 亚洲人体1000| 一区二区三区四区蜜桃| 久久久久久网| 亚洲国产91色在线| 亚洲丰满在线| 激情久久影院| 久久夜色精品国产亚洲aⅴ| 另类尿喷潮videofree| 亚洲国产欧美久久| 欧美人体xx| 亚洲在线视频观看| 欧美一区二区三区日韩视频| 国产亚洲va综合人人澡精品| 久久天堂成人| 日韩亚洲欧美一区二区三区| 亚洲女与黑人做爰| 激情成人av| 欧美巨乳在线观看| 亚洲伊人伊色伊影伊综合网| 久久久久91| 亚洲欧洲日夜超级视频| 欧美v亚洲v综合ⅴ国产v| 一区二区三区久久| 蜜臀av国产精品久久久久| 日韩视频一区二区| 国产精品美女www爽爽爽| 久久免费视频在线观看| 日韩视频精品在线| 久久人人97超碰国产公开结果 | 欧美专区福利在线| 亚洲第一页自拍| 性欧美8khd高清极品| 亚洲成人在线观看视频| 欧美性生交xxxxx久久久| 久久成人免费日本黄色| 亚洲精品视频免费在线观看| 久久精品成人| 亚洲免费观看高清完整版在线观看| 亚洲欧洲一区二区三区在线观看 | 另类激情亚洲| 亚洲中午字幕| 亚洲国产一区二区三区在线播 | 狂野欧美激情性xxxx欧美| 欧美在线free| 免费看精品久久片| 欧美在线观看视频| 一本色道久久综合亚洲精品高清| 国内不卡一区二区三区| 欧美日韩一二三四五区| 久久午夜羞羞影院免费观看| 亚洲欧美激情视频| 亚洲欧洲午夜| 亚洲电影免费观看高清完整版| 久久精品中文字幕一区二区三区| 欧美精品免费看| 老司机一区二区| 久久精品国产精品|