断断续续花了两个多礼拜才把这个问题完全搞定,比开始预想的时间多多了,一开始也没想到会碰到这么多的状况,不过好在是都解决了。
阴影技术是三维渲染里面的一个非常重要的课题,实现方式多种多样,最基本的是从光源方向渲一张ShadowMap,简单易行,但是效果很差,锯齿像牛一样大。想要获得更精细的阴影,唯一的办法就是加大SM的分辨率。
事实上我们对远处的阴影要求并没有近处那么高,粗糙点无所谓,反正离得远也看不见,于是在此之上,出现了Cascaded ShadowMap,简称CSM,它的做法是把相机的可视范围从近裁到远裁分割成N个子视锥,每个视锥渲一张ShadowMap。
这样做的好处很明显,我们希望的是近处的阴影比远处的更精细,这种切分很好的实现了我们的要求。
我这次用的就是这个方法,具体的代码就不贴了,说下大概的实现吧。我们首先要拿到被切分相机的远近裁,然后计算出子视锥的八个顶点坐标。
下图中,C0是近裁,Cm是远裁,Ci代表分割线,假如我们想要分割出N个子视锥,那我们就需要求出N-1个Ci。
通用算法是:
使用混合因子λ将平均切分和指数切分融合起来。
其中,指数切分公式是: