为了让场景看起来更加真实,具有深度信息,我们通常希望光源可以把一些物体的阴影投射到其他物体上,下面介绍如何让一个物体向其他物体投射阴影,以及如何让一个物体接收来自其他物体的阴影。
一、阴影是如何实现的
在实时渲染中,我们最常使用的是一种名为Shadow Map的技术,它会首先把摄像机的位置放在与光源重合的位置上,那么场景中光源的阴影区域就是那些摄像机看不到的地方,而unity就是使用的这种技术。
在前向渲染路径中,如果场景中最重要的平行光开启了阴影,unity就会为该光源计算它的阴影映射纹理(shadowmap),这种阴影的纹理本质上也是一张深度图,它记录了从光源的位置出发,能看到的场景中距离它最近的表面位置(深度信息)。如何判断距离它最近的表面位置,一种方法是把摄像机放置在光源位置上,然后按照正常的渲染流程,即调用Bass Pass和Additional Pass来更新深度信息,得到阴影映射纹理。但这种方法方法会对性能造成一定浪费,因为我们实际上仅仅需要深度信息而已,而这两个pass往往涉及很多复杂的光照模型计算。因此,unity选择使用一个额外的pass来专门更新光源的阴影映射纹理,这个pass就是LightMode标签被设置为ShadowCaster的Pass。这个Pass的渲染目标不是帧缓存,而是阴影映射纹理(深度纹理)。unity首先把摄像机放到光源的位置上,然后调用该pass,通过对顶点的变换后得到光源空间下的位置,并据此来输出深度信息到阴影映射纹理中。因此当开启了光源的阴