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

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| 欧美日韩综合| 国产视频久久久久| 精品动漫3d一区二区三区免费 | 午夜精品视频网站| 欧美在线视频不卡| 亚洲第一搞黄网站| 一区二区三区精品视频在线观看| 亚洲一区二区高清| 久久深夜福利| 欧美视频在线观看免费网址| 国产噜噜噜噜噜久久久久久久久| 国内精品久久久久久久97牛牛| 亚洲福利视频二区| 亚洲永久免费| 欧美国产亚洲精品久久久8v| 一本高清dvd不卡在线观看| 久久精品国产96久久久香蕉| 欧美日本精品| 伊人久久综合97精品| 中日韩视频在线观看| 欧美成人高清| 亚洲女性喷水在线观看一区| 欧美aaa级| 国语自产在线不卡| 亚洲一区二区三区久久 | 欧美诱惑福利视频| 亚洲国产精品电影在线观看| 亚洲一区二区三区精品视频| 欧美高清在线视频观看不卡| 国产亚洲va综合人人澡精品| 亚洲欧美综合另类中字| 亚洲经典自拍| 久久亚洲精品中文字幕冲田杏梨 | 久久久999国产| 欧美午夜精品久久久久久孕妇 | 久久视频免费观看| 亚洲视频一起| 欧美日韩另类综合| 亚洲国产欧美一区二区三区久久| 欧美在线亚洲一区| 亚洲永久网站| 国产精品入口日韩视频大尺度| 99精品视频免费在线观看| 欧美福利精品| 欧美成年人网站| 99国产精品自拍| 亚洲精品色图| 国产精品久久久久aaaa| 亚洲一区二区三区成人在线视频精品 | 国产精品国产三级国产aⅴ无密码| 亚洲激精日韩激精欧美精品| 欧美大片一区| 欧美激情va永久在线播放| 亚洲人成网在线播放| 最新日韩av| 国产精品国产三级国产aⅴ入口| 亚洲欧美在线aaa| 香蕉乱码成人久久天堂爱免费| 国产亚洲精品aa| 蜜臀久久99精品久久久画质超高清| 久久黄色小说| 最新高清无码专区| 夜夜嗨av一区二区三区网页| 国产精品盗摄久久久| 午夜在线a亚洲v天堂网2018| 欧美在线观看视频| 亚洲第一黄色网| 亚洲大黄网站| 亚洲欧美成aⅴ人在线观看| 国产日韩在线视频| 久久精品亚洲乱码伦伦中文 | 欧美大胆人体视频| 久久国产欧美精品| 极品少妇一区二区三区精品视频 | 亚洲毛片在线观看| 欧美精品激情| 亚洲视频网站在线观看| 亚洲午夜激情在线| 欧美激情免费观看| 亚洲天堂成人在线视频| 亚洲一区二区三区影院| 国产日韩精品视频一区| 看欧美日韩国产| 欧美风情在线观看| 亚洲亚洲精品三区日韩精品在线视频| 99精品热视频只有精品10| 国产精品白丝黑袜喷水久久久| 午夜精品福利一区二区三区av| 亚洲欧美99| 最新国产成人av网站网址麻豆| 99视频精品全国免费| 国产日韩一区二区| 亚洲激情视频在线| 激情综合久久| 亚洲精品免费一二三区| 国产精品入口尤物| 欧美成人综合网站| 欧美性大战久久久久久久蜜臀| 久久久久国产精品一区二区| 蜜桃伊人久久| 一区二区三区视频免费在线观看| 亚洲综合视频1区| 亚洲日本中文字幕| 亚洲欧美另类在线| 亚洲乱码国产乱码精品精 | 国产精品视频1区| 亚洲第一精品在线| 欧美精品18| 久久久精品国产免大香伊 | 欧美性猛交xxxx免费看久久久| 久久精品91| 欧美女同在线视频| 久久偷窥视频| 国产精品一区二区三区成人| 亚洲国产一区二区在线| 国产色综合网| 一区二区毛片| 国产精品v日韩精品v欧美精品网站| 久久久久国产精品一区| 国产精品人人做人人爽| 亚洲黄页视频免费观看| 国模 一区 二区 三区| 亚洲一区二区3| 一区二区精品在线观看| 蜜桃久久精品乱码一区二区| 久久婷婷亚洲| 国外成人网址| 亚洲精品午夜精品| 亚洲性视频网站| 欧美日韩成人综合| 亚洲第一区中文99精品| 伊人成综合网伊人222| 小黄鸭精品aⅴ导航网站入口| 亚洲一区二区三区精品在线观看 | 亚洲精品社区| 麻豆av福利av久久av| 性色av香蕉一区二区| 国产精品人人爽人人做我的可爱| 一本一本a久久| 亚洲一区二区三区久久| 国产精品久久久久久av下载红粉 | 国产欧美日本一区二区三区| 亚洲一区二区三区777| 午夜亚洲福利在线老司机| 国产精品qvod| 亚洲欧美色婷婷| 久久精品国产精品 | 在线观看中文字幕不卡| 久久久一本精品99久久精品66| 久久成人av少妇免费| 国产麻豆午夜三级精品| 亚洲欧美韩国| 久久精品国产一区二区三区免费看| 国产农村妇女精品一区二区| 欧美一区在线直播| 免费国产自线拍一欧美视频| 最近中文字幕日韩精品| 欧美日韩精品一区| 亚洲一区二区三区高清不卡| 欧美成人性生活| 国产精品99久久久久久有的能看| 欧美视频福利| 亚洲一级免费视频| 韩国在线视频一区| 久久久久九九视频| 精品999成人| 欧美国产免费| 一区二区精品在线| 久久免费观看视频| 亚洲日本成人| 国产精品美女久久久久久久| 亚洲资源在线观看| 老牛嫩草一区二区三区日本| 91久久视频| 国产伦精品一区二区三区高清版| 久久久久国产精品厨房| 一本不卡影院| 欧美亚洲自偷自偷| 亚洲日本国产| 国产精品一区二区欧美| 欧美肥婆在线| 久久精品国产第一区二区三区|