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

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 閱讀(1520) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一区二区三区精品视频在线观看 | 欧美在线啊v一区| 欧美无砖砖区免费| 亚洲午夜视频| 亚洲无线视频| 国产一区视频网站| 欧美夫妇交换俱乐部在线观看| 久久久成人网| 日韩一级片网址| av成人天堂| 国产日韩视频| 欧美成人激情视频| 欧美日韩mp4| 欧美一区二区视频在线观看2020| 性刺激综合网| 亚洲黄色在线看| 一区二区三区视频在线播放| 国产视频久久久久久久| 欧美成人免费网站| 欧美日韩在线播放| 久久久亚洲影院你懂的| 欧美国产欧美亚州国产日韩mv天天看完整| 夜夜嗨av一区二区三区网站四季av | 午夜欧美视频| 久久久国产成人精品| 亚洲久久视频| 欧美亚洲综合网| 亚洲精选在线观看| 欧美一级视频一区二区| 日韩性生活视频| 欧美一级在线视频| 宅男精品视频| 久久久久女教师免费一区| 一区二区三区高清视频在线观看 | 欧美jjzz| 国产精品卡一卡二卡三| 欧美电影在线播放| 国产日韩精品视频一区| 亚洲人成亚洲人成在线观看图片| 国产精品一区免费视频| 亚洲国产欧美一区二区三区同亚洲 | 欧美在线资源| 亚洲午夜一区二区三区| 麻豆av福利av久久av| 欧美一区二区网站| 欧美日韩成人精品| 欧美电影打屁股sp| 国产一区二区毛片| 亚洲在线一区二区| 中国成人在线视频| 欧美久久久久久| 欧美www视频在线观看| 国产丝袜一区二区| 亚洲特黄一级片| 在线视频免费在线观看一区二区| 裸体歌舞表演一区二区| 久久久久久国产精品一区| 国产精品久久综合| 亚洲天天影视| 午夜国产精品影院在线观看| 欧美日韩精品一区视频| 亚洲高清不卡| 亚洲人成人77777线观看| 免费视频久久| 亚洲国产精品小视频| 亚洲欧洲中文日韩久久av乱码| 久久综合久色欧美综合狠狠| 久久婷婷久久一区二区三区| 激情欧美一区二区三区| 久久午夜视频| 亚洲第一中文字幕| 亚洲免费高清视频| 欧美视频一区二| 亚洲性感激情| 欧美一区国产一区| 国内精品久久久久伊人av| 久久精品一区二区| 欧美国产精品一区| 亚洲免费av网站| 欧美日韩免费网站| 亚洲欧美久久久久一区二区三区| 午夜日韩在线观看| 国内精品视频久久| 欧美成人亚洲成人日韩成人| 亚洲黑丝在线| 亚洲欧美精品在线| 国内精品伊人久久久久av影院| 久久久久久久久久久一区| 欧美国产精品中文字幕| 一区二区激情| 国产亚洲欧美日韩日本| 久久亚洲高清| 亚洲毛片一区二区| 久久成人综合网| 亚洲精品中文字幕有码专区| 欧美性猛交xxxx乱大交蜜桃| 午夜精品一区二区三区四区| 欧美成年人视频| 亚洲一级片在线观看| 国产一本一道久久香蕉| 欧美成人综合| 亚洲欧美日韩国产精品| 亚洲第一中文字幕在线观看| 午夜欧美大片免费观看| 在线成人激情| 国产精品热久久久久夜色精品三区 | 欧美~级网站不卡| 亚洲影院色无极综合| 影院欧美亚洲| 国产精品久久久久久久app| 久久深夜福利| 亚洲综合电影一区二区三区| 亚洲国产天堂网精品网站| 久久久久九九九| 亚洲欧美日韩一区在线| 亚洲日本视频| 有码中文亚洲精品| 国产麻豆午夜三级精品| 欧美日韩成人在线观看| 久久女同精品一区二区| 亚洲小说欧美另类社区| 日韩视频免费在线| 欧美福利一区| 久久人人看视频| 午夜精品一区二区三区在线播放 | 在线中文字幕日韩| 亚洲黄网站黄| 亚洲成色777777在线观看影院| 国产欧美丝祙| 国产精品国产三级欧美二区| 欧美成人精品福利| 久久久久青草大香线综合精品| 亚洲欧美日韩成人高清在线一区| 亚洲精品少妇30p| 亚洲高清视频在线观看| 欧美黄色aa电影| 麻豆精品精华液| 久久久久在线观看| 久久精品一区二区三区中文字幕 | 亚洲永久免费观看| 9i看片成人免费高清| 亚洲精品一二| 亚洲精一区二区三区| 日韩视频免费观看| 99国内精品| 亚洲香蕉视频| 亚洲免费在线观看视频| 亚洲午夜未删减在线观看| 亚洲素人一区二区| 亚洲欧美中文日韩v在线观看| 亚洲午夜精品视频| 午夜精品久久| 久久精品视频亚洲| 美女被久久久| 亚洲大胆av| 日韩午夜在线电影| 亚洲性xxxx| 久久精品成人| 欧美国产日韩一区二区| 欧美日韩在线一区| 国产精品日本一区二区| 国产欧美一区二区视频| 黑丝一区二区三区| 亚洲黄色免费| 亚洲视频日本| 久久露脸国产精品| 欧美高清在线一区二区| 亚洲人成77777在线观看网| 99精品免费网| 久久福利资源站| 欧美成人一区二区三区在线观看 | 国产精品视频一区二区三区| 国产日韩欧美视频在线| 在线成人h网| 亚洲一区二区三区午夜| 久久精品一区| 91久久精品一区| 亚洲欧美一区在线| 欧美成人在线影院| 国产日韩精品一区二区三区在线| 在线观看亚洲精品| 亚洲无吗在线| 欧美韩日一区二区三区| 亚洲欧美日韩成人| 欧美精品日韩| 黑人巨大精品欧美黑白配亚洲| 亚洲免费观看| 久久影视三级福利片| 亚洲免费av片| 久久亚洲春色中文字幕| 国产精品国产三级国产专播品爱网 | 麻豆精品网站| 亚洲视频一区二区| 欧美aⅴ一区二区三区视频| 国产精品视频内| 在线一区二区三区四区五区| 欧美xart系列高清| 午夜精品久久久久久久男人的天堂| 理论片一区二区在线| 国产视频一区欧美|