花了大概几周的时间实现了软阴影。总的来说难度还是比较大的,而且我也走了些弯路,不过也值得,单是写shader不是很难,但要放到引擎中还是有点难度。shadowmap的原理我就不讲了,网上有很多。
这里所说的是light space shadowmap。单是shadowmap的实现有两种:一种是创建浮点纹理存放深度,然后在shader中与当前像素的深度比较。另一种是创建depthstencil纹理,并设为当前的深度缓冲,最后拿这个纹理作为shadowmap。注意,第二种才是真正的nvidia上说的hardwareshadowmap,第一种并不是。我这里说的是通过两种的比较来总结一下。
这两种方法都有一个共同点:就是要把像素中的坐标转换到lightviewproj(以灯为视点的投影空间)的纹理坐标。
我之前一直是用第一种方法,也参考了nvidia上的hardwareshadowmap和softshadowmap,但问题就出来了,深度一定要自己比较,所以当实现了软阴影的时候,自己比较就无法看到软阴影,但不比较,深度又有错误,而且depthbias起不到应有的作用。
后来改用第二种方法,所有问题都解决了,纹理为D24S8,用tex2DProj就可以自动比较深度,至于为什么能比较,我也不太清楚。如果有高手可以解释一下就非常感谢了。