unity3d 遮挡剔除教程
遮挡剔除的基本概念
遮挡剔除是一项重要的图形渲染特性。当一个物体被其他物体遮挡,且不在摄像机的可视范围内时,系统将不对该物体进行渲染。需要注意的是,在 3D 图形计算中,遮挡剔除并非自动进行的。
在绝大多数情况下,离摄像机最远的物体首先被渲染,而靠近摄像机的物体后渲染,并且会覆盖先前渲染的物体,这种现象被称为重复渲染或无效渲染(“overdraw”)。遮挡剔除与视锥体剔除有所不同,视锥体剔除仅仅是不渲染处于摄像机视角范围外的物体,而对于那些虽被其他物体遮挡但仍处于视角范围内的物体,视锥体剔除并不处理。不过,当你使用遮挡剔除时,依然可以从视锥体剔除中受益。
遮挡剔除的效果对比
为了更直观地感受遮挡剔除的效果,我们来看一个对比示例。左边的场景使用了遮挡剔除,右边的场景未使用遮挡剔除。从这个对比中,我们能明显看到遮挡剔除对渲染效率的提升。
遮挡剔除的运行机制
遮挡剔除的运行是通过在场景中使用一个虚拟摄像机来创建物体潜在可视性状态(set)的层级。这些数据可供每个运行时的摄像机确定哪些物体是可见的,哪些是不可见的。借助这些数据,Unity 能够确定只将可见的物体送去渲染,从而减少绘制调用(draw calls)的数量,提高游戏的运行效率。
遮挡剔除的数据结构
遮挡剔除的数据由单元(cells)组成,每个单元是整个场景范围数值的一部分。更具体地说,这些单元来自一个二叉树(binary tree)。遮挡剔除使用两个分支,一个用于视图单元(View Cells,对应静态物体),另一个用于目标单元(Target Cells,对应移动物体)。视图单元映射(View Cells map)给出了一个定义了静态可视物体的索引列表(即经过精确剔除后的静态物体)。
物体创建的注意事项
在创建物体时,有一点非常重要,那就是需要在物体的尺寸和单元的尺寸之间取得良好的平衡。理想情况下,有时可以通过将大的物体拆分成几个部分来改善遮挡剔除的效果。另外,你仍然可以将小的物体合并为一体以降低绘制调用。但需要注意的是,当这些小物体都属于一些小的组件时,遮挡剔除可能不起作用。确定组件中哪些是可视组件的选集以及可视信息被称为 PVS(潜在可视状态,Potentially Visible Set)。