4.8 阴影
阴影的实现方式有很多种,消耗和效果各异。
4.8.1 贴图阴影
贴图的方式最简单,做法是制作一张阴影纹理,放到物体脚下(下图),跟随物体一起运动。
贴图阴影渲染非常简单,只需要两个三角面,适用于低端机型。如果地面是起伏不平的,贴图会被地面遮挡,可以将阴影贴图用贴花技术紧贴地面。但贴花依然有可能跟其它动态物体发生异常遮挡。
4.8.2 Projector(投射阴影)
Projector技术是预先指定光源位置和截头体(Frustum),然后算出物体在其它物体的投影。(下图)
它可以将物体投影到任意平面上,但跟贴图阴影一样不能表达被投影物体的轮廓。适用于中等画质效果。
4.8.3 Shadow Map(阴影图)
阴影图技术是将物体放入灯光空间(上图)渲染,得到灯光空间的深度图(也称阴影图),然后在正常渲染时只要让某个片元在灯光空间的深度与阴影图做比较,就可判断出该片元是否处在阴影之中(下图)。
Shadow Map技术可以渲染物体在任意平面的投影,渲染的效果最接近真实世界(下图),但性能消耗会高很多,它会增加Draw Calls,增加显存占用。通常适用于高端机型或重要角色。
4.8.4 阴影的分级策略
ShadowMap效果最好,但最耗性能,而贴图方式刚好相反。这就要根据项目具体情况做出分级策略,针对不同画质不同重要程度的物体采用不同的阴影渲染方式。下表是游戏Z的分级策略。