Common Techniques to Improve Shadow Depth Maps

http://msdn.microsoft.com/en-us/library/ee416324(VS.85).aspx

dx sdk上的一个文章,比较系统和全面的介绍了shadow map中各种遇到的问题,和解决方案。

 

ftp://download.nvidia.com/developer/presentations/2004/GPU_Jackpot/Shadow_Mapping.pdf

还有nv的一个比较老的,内容很相似。

 

Perspective Aliasing

精度不够的,shadow大锯齿:

Common Techniques to Improve Shadow Depth Maps

解决:cascaded shadow map比较合适。

 

 

 

projective alising

surface和光线平行的时候,锯齿很可怕,这个也是精度问题,和perspective alising一个解决方法。

 

self shadow

类似z fighting的问题,也是精度问题:

Common Techniques to Improve Shadow Depth Maps

单纯图中这个问题depth bias一下就好,但是self shadow问题比这多很多啊,但是bias多了会像下面这样,也很悲剧:

Common Techniques to Improve Shadow Depth Maps

 

 

一些常用解决方案:

  • depth bias:直接看api就好,里面有slope参数。
  • tight projection:

shadow frustum尽可能的不浪费,near,far,left, right可以根据view camera和要render的obj的bounding box来尽可能的缩紧。

但是准确的判定有可能造成精度变化大,影子看起来随着camera的变化也乱变,做出各种情况下都适用的解决方案也挺麻烦和复杂的。

  • 以texel size为单位来移动lighting,这样锯齿保持稳定,不会发生慢慢锯齿蠕动的恶心事情

代码也很直接,用一个floor操作符就好。

 

nv文章里面一再提起的就是在精度不足情况下,几乎任何算法都是有纰漏的。

很多时候问题的解决是“art instead of science”。


原文链接: http://blog.csdn.net/ccanan/article/details/5988138

你可能感兴趣的:(Common Techniques to Improve Shadow Depth Maps)