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

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>
            亚洲欧美另类国产| 久久av资源网| 国产欧美日韩一区| 国产精品久久久免费| 欧美视频在线一区| 国产精品99免视看9| 欧美视频不卡中文| 国产精品系列在线| 黄色成人片子| 亚洲久色影视| 性做久久久久久| 久久躁日日躁aaaaxxxx| 亚洲二区三区四区| 亚洲第一精品夜夜躁人人爽 | 午夜免费久久久久| 欧美专区日韩专区| 国产精品美女久久久久久2018| 亚洲精品网址在线观看| 亚洲精品婷婷| 性欧美1819性猛交| 麻豆久久精品| 国产精品久久二区| 在线观看久久av| 一本色道久久综合亚洲91| 欧美一区2区视频在线观看| 免费91麻豆精品国产自产在线观看| 91久久视频| 性亚洲最疯狂xxxx高清| 欧美精品1区2区| 国产色婷婷国产综合在线理论片a| 亚洲国产精品久久久久婷婷老年| 亚洲视频免费在线| 欧美mv日韩mv亚洲| 亚洲欧美综合国产精品一区| 欧美韩日一区二区三区| 国语自产精品视频在线看8查询8 | 欧美另类变人与禽xxxxx| 国产欧美日韩综合| 一区二区久久久久久| 久久综合网络一区二区| 亚洲午夜精品一区二区三区他趣| 久久在线免费视频| 国产日韩三区| 亚洲影院在线| 亚洲激情影视| 毛片基地黄久久久久久天堂| 国产欧美在线看| 亚洲欧美成人| 99www免费人成精品| 美女视频黄免费的久久| 国际精品欧美精品| 久久成人国产精品| 亚洲在线电影| 国产精品你懂得| 亚洲影音一区| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美激情亚洲| 一区二区精品国产| 夜夜嗨av一区二区三区| 欧美日韩精品一本二本三本| 亚洲精品中文在线| 亚洲精品乱码久久久久久蜜桃91| 欧美成人自拍视频| 亚洲精品国产精品乱码不99| 欧美www在线| 欧美成人精品在线观看| 亚洲理伦在线| 一本色道久久综合精品竹菊 | 亚洲精品欧美日韩| 欧美激情女人20p| 女人色偷偷aa久久天堂| 亚洲国产精品精华液2区45| 久久综合狠狠综合久久综合88| 国产在线视频欧美| 免费观看在线综合色| 美女福利精品视频| 亚洲最新合集| 亚洲一区二区精品在线观看| 国产精品自拍小视频| 久久www成人_看片免费不卡| 欧美在线一区二区三区| 亚洲大胆人体视频| 亚洲另类自拍| 国产日韩成人精品| 欧美高清视频一区二区| 欧美日韩你懂的| 欧美伊人久久久久久久久影院| 久久国产精品久久久久久| 最新国产成人在线观看| 亚洲视频在线播放| 亚洲成人在线视频网站| 亚洲毛片av在线| 国外精品视频| 夜夜精品视频一区二区| 国内精品久久久久影院优| 亚洲国产小视频| 国产偷国产偷亚洲高清97cao | 久久综合中文色婷婷| 欧美激情亚洲视频| 欧美制服丝袜| 欧美国产日韩视频| 久久国产精品亚洲77777| 蜜臀av一级做a爰片久久| 亚洲在线视频免费观看| 久久亚洲图片| 欧美一区二区| 欧美精品久久久久久久久久| 欧美在线不卡| 欧美日韩国产三区| 免费黄网站欧美| 国产精品一区二区久久久久| 亚洲高清不卡在线观看| 国产亚洲精品7777| 一区二区三区高清| 亚洲毛片在线看| 久久久久久自在自线| 欧美一区中文字幕| 国产精品www994| 亚洲精品国产品国语在线app| 韩日欧美一区| 亚洲欧美综合精品久久成人 | 欧美激情亚洲精品| 国内精品一区二区三区| 亚洲一区成人| 亚洲一区二区三区国产| 欧美精品国产精品| 亚洲国产成人高清精品| 黄色精品免费| 久久aⅴ国产欧美74aaa| 欧美一区二区三区婷婷月色| 欧美三级免费| 99pao成人国产永久免费视频| 午夜欧美不卡精品aaaaa| 日韩亚洲欧美成人一区| 久久综合色一综合色88| 久久综合久久综合这里只有精品| 国产精品毛片va一区二区三区 | 国产精品永久免费| 亚洲视屏一区| 午夜激情亚洲| 国产精品亚洲人在线观看| 一区二区免费在线视频| 一本色道久久88综合亚洲精品ⅰ | 久久久久久自在自线| 嫩草国产精品入口| 亚洲第一毛片| 欧美精品999| 在线亚洲电影| 欧美在线观看一区二区| 好吊妞**欧美| 免费美女久久99| 亚洲美女视频网| 亚洲免费视频中文字幕| 国产模特精品视频久久久久| 欧美影院久久久| 女人色偷偷aa久久天堂| 99国产精品久久久| 欧美性猛交xxxx乱大交蜜桃| 亚洲欧美国产日韩天堂区| 久久国产精品72免费观看| 曰韩精品一区二区| 欧美日韩国内| 欧美影院视频| 日韩视频在线一区二区三区| 香蕉乱码成人久久天堂爱免费| 国内精品免费在线观看| 欧美日韩1区2区3区| 午夜精品福利一区二区三区av| 免费成年人欧美视频| 亚洲一级免费视频| 狠狠操狠狠色综合网| 欧美成人亚洲成人| 亚洲与欧洲av电影| 亚洲高清中文字幕| 欧美一级二级三级蜜桃| 91久久精品美女| 国产欧美日韩精品专区| 欧美成人免费观看| 亚洲一区日本| 亚洲国产乱码最新视频| 欧美一区成人| 亚洲视频免费观看| 亚洲国产美女精品久久久久∴| 欧美色道久久88综合亚洲精品| 久久久精品日韩欧美| 一区二区三区精品视频| 欧美韩日一区二区三区| 欧美伊人久久久久久久久影院| 日韩写真视频在线观看| 国产综合亚洲精品一区二| 国产精品v一区二区三区| 麻豆精品视频在线| 欧美综合第一页| 亚洲一区黄色| 亚洲开发第一视频在线播放| 欧美 日韩 国产在线| 久久久久99| 午夜精品久久久久久久久久久久久| 亚洲人成亚洲人成在线观看图片| 国产一区二区激情|