遮挡剔除(Occlusion Culling),以下统称OC。
一、是否开启OC性能差异
在场景中放置一定数量的物体,是否开启OC数据比对
1)正常情况下的渲染状态:
2)开启OC后的渲染状态:
3)是否开启OC数据比对:
DrawCalls
TotalBatches
Tris
Verts
FPS
正常情况
37
222
163.8k
119.8k
612
开启OC
6
6
1.0k
5.1k
698
结果****:在场景中开启OC,数据上有明显的差异,开启后的数据明显优于正常情况下的数据。
二、unity OC的使用
物件标记(是否遮挡)
unity的OC只适用于静态物体,静态物体在Bake的过程中会做预处理。静态物体的标记包括灯光、导航,遮挡等。
为了较少计算,缩短烘焙时间,我们不必全部勾选。
在遮挡剔除这块分为两种物件类型:遮挡器(Occluders)和遮挡物(Occludees)(遮挡和被遮挡)。大部分情况下是两种一起勾选,当然要确保物体是不透明的,否则不适合成为遮挡器。
物体勾选Occluders staic和Occludees static
设置合适的Bake(烘焙)参数
打开OC面板
Smallest Occluder:最小遮挡物的尺寸,该值越小,烘焙的效果越好越精确(过大会导致剔除成功率下降,过小会导致性能问题)。
Smallest Hole:如果场景中有带孔的物体需要能被视线穿透(例如墙上的洞, 房间的门),那么需要将Smallest Hole设置为小于孔的直径。
Backface threshold:百分比,减少剔除数据大小。大部分情况下不需要修改(默认100%),设置不当会导致剔除错误(可见的物体被剔除了)。
Bake
数据预处理
clear:清除生成的烘焙数据
Bake:生成数据。
bake后会生成一个跟场景名同名的文件夹,保存烘焙后的数据
效果预览
选择OC面板的Visualization选项卡,就可以在场景中实时移动摄像机,观察遮挡剔除情况。
三、Uinty遮挡剔除实现原理
Unity 的遮挡剔除是通过第三方插件Umbra实现的,Umbra的运作方式可以分为编辑和执行两个阶段。
编辑阶段,在编辑器里Umbra会即时检查可以被看到的物件
首先Umbra会采样游戏场景并透过烘焙(Bake)将场景纪录成为一个资料结构
在制作结构的期间,Umbra会先像素化场景
把一区一区的点归类群组
并把每一区(Cell)合并到传送区(Portal)
再添加一些必要的数据资料就会成为Unity用的遮挡剔除资料
在执行阶段,开启单向检查(不会传回任何false值)。Unity会给Umbra镜头坐标,Umbra会在场景里从镜头到最远的遮挡物中间投射出一条条的线检查可视深度,检测哪些物体是可见的(编辑状态下,检测可见性是实时执行的),并将这些可见资料格式化后从传送区放到缓冲区。
四、OC的一些不足
只在相对明显的遮挡关系上有比较显著的效果,因为Umbra运作原理相对保守,因此在物体结构相对复杂且倍数相同的情况下并没有取得太理想的效果,只有视锥体以外的会被剔除。,如下图所示:
摄像机只有在固定区域内,遮挡剔除才会起效;超过区域,烘焙的数据就无法计算