(转) GEM透视阴影贴图

转载:小道 git

透视阴影贴图(Perspective Shadow Maps, PSMs)是由StammingerDrettakis github

SIGGRAPH 2002上提出的一种阴影贴图(Shadow Maps)流派的方法。 算法

透视投影贴图方法的基本思想是,为了减小或消除阴影贴图的失真走样,对投射到大像素区域的物体取最大的阴影贴图纹素密度 app

这章提出了一种优化透视阴影贴图(Perspective Shadow Maps)方法的新思路,对其三种缺陷都一一进行了改进。 post

【核心要点】 测试

这章首先讲到动态阴影的建立,目前主要有两个算法流派: 优化

  • 阴影体(shadow volumes/模板阴影(stencil shadows
  • 阴影贴图(Shadow Maps

阴影体和阴影贴图算法之间的不一样之处在于,是涉及到物体空间(object space)仍是图像空间(image space)。 spa

  • 阴影体(Shadow Volumes)是物体空间Object Space)的阴影算法,经过建立表示阴影遮挡的多边形结构来工做,这意味着咱们始终具像素精确但较""的阴影。此方法没法处理没有多边形结构的对象,好比通过alpha测试修改的几何图形或通过位移映射的几何体(displacement mapped geometry)。此外,绘制阴影体须要大量的填充率,这使得很难将它们用于密集场景中的每一个对象上,特别是在存在多个灯光时。
  • 阴影贴图(Shadow Maps)是图像空间Image Space)的阴影算法,它能够处理任何物体(若是可以渲染一个物体,就能获得它的阴影),可是存在走样(aliasing,锯齿)的问题。走样时常发生在有较宽或全方位光源的大场景中。问题在于阴影映射中使用的投影变换会改变阴影贴图像素的大小,所以摄像机附近的纹理像素变得很是大。所以,咱们必须使用巨大的阴影贴图(四倍于屏幕分辨率或更高)来实现更高的质量。尽管如此,阴影贴图在复杂场景中却比阴影体要快得多。

透视阴影贴图(Perspective Shadow Maps, PSMs)是由StammingerDrettakisSIGGRAPH 2002上提出的一种阴影贴图(Shadow Maps)流派的方法,经过使用在投射后空间(post-projective space)中的阴影贴图来去除其中的走样,而在投射后空间中,全部近处的物体都比远处的大。不幸的是,使用原始算法很困难,由于只有要某些状况下才能正常工做。 3d

如下是透视阴影映射算法的三个主要问题和解决方案: code

1、当光源在摄像机后面的时候,有一个虚拟的摄像机锥体。若在锥体内保持全部潜在的阴影投射体,阴影质量就会变得不好。

解决方案:是对光源矩阵使用特别的投射变换,由于投射后空间能够使用某些在一般空的世界空间中不能作的投射技巧。它使咱们能够创建特殊的投射矩阵,能够看作"比无限远更远"

2、光源在摄像机空间中的位置对阴影质量影响很大,对于垂直的方向光,彻底没有走样问题,可是当光源朝向摄像机并迎面靠近它时,阴影映射走样就很严重。

解决方案:把整个单位立方体保持在一个阴影贴图纹理中,对于遇到的问题,有两个办法,每一个办法仅解决问题的一部分:单位立方体裁剪法,把光源摄像机对准单位立方体的必要部分;立方体映射法,使用多个纹理来存储深度信息。

3、最初的文章没有讨论过偏置(bias问题。偏置是随透视阴影贴图而带来的问题,由于纹素的面积以不均匀方式分布,这意味着偏置再也不是常量,而是与纹素的位置有关

解决方案:使用在世界空间中的偏置(并且再也不分析双投射矩阵的结果),而后把这个世界空间偏置转换到投射后空间。

获得的阴影实时渲染结果(多边形10w ~ 50w个,分辨率1600x1200)。

【本章配套源代码汇总表】

Example 14-1计算立方体阴影纹理坐标(Shader Code for Computing Cube Map Texture Coordinates

Example 14-2在顶点Shader中计算偏置(Calculating Bias in a Vertex Shader

Example 14-3 紧邻百分比过滤的顶点Shader伪代码(Vertex Shader Pseudocode for PCF

Example 14-4 用于紧邻百分比过滤的像素Shader伪代码(Pixel Shader Pseudocode for PCF

【关键词提炼】

阴影渲染(Shadow Rendering

阴影贴图(Shadow Maps

透视阴影映射(Perspective Shadow MapsPSMs

紧邻百分比过滤(percentage-closer filtering PCF

单位立方体裁剪法(Unit Cube Clipping

   

来自 <https://github.com/QianMo/Game-Programmer-Study-Notes/blob/master/Content/%E3%80%8AGPU%20Gems%201%E3%80%8B%E5%85%A8%E4%B9%A6%E6%8F%90%E7%82%BC%E6%80%BB%E7%BB%93/README.md#%E4%B8%80%E3%80%81-%E7%94%A8%E7%89%A9%E7%90%86%E6%A8%A1%E5%9E%8B%E8%BF%9B%E8%A1%8C%E9%AB%98%E6%95%88%E7%9A%84%E6%B0%B4%E6%A8%A1%E6%8B%9F%EF%BC%88effective-water-simulation-from-physical-models%EF%BC%89>

相关文章
相关标签/搜索