阴影映射ShadowMapping示例.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE1 / NUMPAGES5 阴影映射(Shadow Mapping)示例 这个示例展示了如何从一个单向光源实现一个基本的阴影映射,而阴影贴图的视场和投影可以匹配相机的视锥体。你可以使用这个示例让一个大场景中的多个动态对象投下动态阴影。 原文地址: /en-US/sample/shadowmapping1。 什么是阴影映射(Shadow Mapping)? 阴影映射是指一种产生阴影的技术,你可以将对象离开光源的距离存储在一张纹理中。 当绘制场景时,你可以使用这个离开光源的距离判断要绘制的像素是否在存储在阴影贴图中的值之后。 阴影映射技术需要绘制场景两次。第一次从光源视场中绘制可以产生阴影的所有对象,这些对象叫做遮蔽体(occluders)。这意味着你需要创建一个位于场景光源位置和光源方向的视矩阵和投影矩阵。对象的深度信息存储在一个渲染目标中。渲染目标通常使用的格式是一个32位浮点类型的SurfaceFormat.Single,它可以以32位的精度存储对象的深度值。但是有些显卡不支持这个格式,所以如果你使用的是这种类型的显卡,你必须使用16位浮点数的SurfaceFormat.HalfSingle。更老的显卡完全不支持浮点数格式的渲染目标,需要一个诸如 SurfaceFormat.Rgba32之类的表面格式,在这种情况中,要将距离放置在4个8位的通道中。 第二步是从相机视场中绘制场景。判断每个像素离开光源的距离。然后采样存储在阴影贴图中的值。如果阴影贴图中的距离小于像素离开光源的距离,你就知道这个像素被另一个物体遮挡,它会处于阴影之中。 上图表示如何从光源视场和相机视场中绘制场景。红色矩形表示最终的后备缓冲的内容。蓝色矩形表示存储在阴影贴图中的内容。注意观察位于橙色球体后面的灰色矩形只有特定部分才位于阴影中。 当使用阴影贴图绘制场景时会有一些显示错误。一个错误与存储深度值的表面格式有关。你使用的这些值限制了判断离开光源距离的精度。这会导致某些距离接近的地方阴影会不正确。这个问题在脸部的自阴影中最为明显 ,这种错误叫做shadow acne(译者:acne意味痤疮粉刺,很形象)。 下图展示了一个shadow acne例子。通常可以使用一个bias偏移量修正这些错误。 另一个场景的错误是源自渲染目标中像素的限制和渲染目标覆盖的范围。如果你将一个很大的区域绘制到一个渲染目标中(就像这个示例中做的那样),那么一个图素(texel)覆盖的区域就很大。当镜头拉近时,你会注意到阴影边缘不是平滑的,这种情况叫做锯齿(aliasing),是由覆盖场景的阴影贴图分辨率不够造成的,下图展示了锯齿的例子。 另一个错误只会发生在将一个对象的一部分绘制到阴影贴图的情况中,这会导致阴影中产生一个洞,这种情况通常发生在当对象位于阴影贴图的边缘时。本例中这种情况发生在当相机移动到模型后面时,此时相机的视锥体不包含模型的某一部分,所以,阴影贴图也不包含模型的某一部分,如下图所示。 示例简介 阴影映射算法的第一步是从相机视角绘制场景。要做到这步,你需要视矩阵和投影矩阵。要最大限度地使用渲染目标的分辨率,这个视矩阵和投影矩阵要对应一个尽量小的视锥体。在本例中,视矩阵和投影矩阵对应相机视锥体的最小包围盒。这可以让阴影贴图只包含用户可见的部分,同时仍然包含完整的可见部分。 上图显示了相机视锥体,相机视锥体的角用来获取匹配光线方向的最小包围盒。这个技术是用于单向光源的基本阴影映射技术,但它还有一些限制,我们会在最后加以讨论。 最小Shader配置 Vertex Shader Model 2.0 Pixel Shader Model 2.0 示例控制 本示例使用以下键盘和手柄控制。 动作 键盘控制 手柄控制 旋转相机 UP、DOWN、LEFT和RIGHT方向键 右摇杆 移动相机 W, S, A和D 左摇杆 退出 ESC 或 ALT+F4 BACK 工作原理 本示例有4个主要部分: 创建渲染目标和深度缓冲 计算光源视矩阵和投影矩阵CreateLightViewProjectionMatrix 创建阴影贴图CreateShadowMap 使用阴影贴图DrawModelsWithShadow绘制场景 要创建一个纹理储存对象的深度,你需要使用RenderTarget2D创建一个渲染目标。这个示例使用一个长宽都为2048的浮点数类型的纹理SurfaceFormat.Single,这可以提高结果的精度。在写入阴影贴图时还需要使用DepthStencilBuffer,它存储了场景的z值,让你可以在阴影贴图中只存储离开光源最近的点。 要计算光源的视矩阵和投影矩阵,CreateLightViewProjectionMatrix方法获取光线方向上最匹配的相机视锥体Bo

文档评论(0)

yuxiufeng + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档