阴影映射(Shadow Map)的研究(二)
上一篇文章介绍了我对Z缓存的较为详细的研究。这里之所以对Ze求导函数,是因为的我们需要寻找它的变化曲线,从而找到极值点,这样就能够确定Ze相对于zw的疏密分布情况。幸运的是,我们找到的导函数是双曲函数,并且我们关心的的右侧是单调递增的。
蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/44946763。欢迎同行前来探讨。
引出上一篇文章的结论,当
时,导函数取得最大值。但是在Zw∈[0,2n-1]上导函数是单调递增的,原函数Ze在Zw∈[0,2n-1]上是单调递减的。这就导致了16、24或者32位的深度数据用了很大一部分的范围来区分视角空间近处很小一部分的Z值,远处的Z值只用很小一部分的数据范围来区分,所以越是远处的数据,就越容易造成z-fighting。那么我想将尽量让远一些的地方分配较大范围的Z值该怎么办呢?
根据导函数和原函数在上篇文章得出来的解析式以及图像,我们需要让相同的[0,Ze]用更丰富的[0,zw]来表示,那么就需要将函数的图像向右平移。如下图所示:
于是我们要将极值点(不可导)
向右平移。通过设定:
解不等式,最后得到
不等式右边是一个常量,那么要求左边near尽量大或者far尽量小或者二者兼施,这样才能保证更多的精度用于更远的摄像机空间位置。
我们产生的阴影映射要避免精度过低,或者z-fighting现象,需要光照和摄像机空间的near和far需要遵守上面的规律。这里我拿我的例子程序来作对比:
可以看到,近远裁面的正确设置对减少z-fighting起到的作用是非常显著的。
时间: 2024-10-23 12:38:44