意义
遮挡剔除,当一个物体被其他物体遮挡住而不在摄像机的可视范围内时不对其进行渲染。
不同于视锥剔除(只是不渲染摄像机视角范围外的物体)。
Unity怎么做到的
采用了Umbra's occlusion culling算法:
The occlusion culling process will go through the scene using a virtual camera to build a hierarchy of potentially visible sets of objects. This data is used at runtime by each camera to identify what is visible and what is not.
The data for occlusion culling is composed of cells. Each cell is a subdivision of the entire bounding volume of the scene. More specifically the cells form a binary tree. Occlusion Culling uses two trees, one for View Cells (Static Objects) and the other for Target Cells (Moving Objects). View Cells map to a list of indices that define the visible static objects which gives more accurate culling results for static objects.
关键点:
Balance between the size of your objects and the size of the cells.
怎么使用Unity Occlusion Culling
Unity单位长度对应1米。
场景静态模型的制作。太大,总是会看到物体的某一部分,导致剔除效果不好;太小,增加drawcall。
-
参与Occlusion Culling的场景对象,勾上Static(Occluder Static和Occludee Static)。对于不可能成为遮挡物的对象,如透明物体、很小的物体,可只勾选Occludee Static,表示只会被遮挡,以减少计算。Occluder可理解为“遮挡者”,Occludee可理解为“被遮挡者”,类似employer和employee的关系。所以建议对于不希望被遮挡剔除的非静态物体,可以用另外的摄像机观看。
-
如果需要遮挡运动的(non-static)对象,则需要创建Occlusion Area。但目前通过测试看来,即使没有创建Occlusion Area时,Unity默认整个场景是一个大的Occlusion Area,会自动遮挡运动的对象。
参数设置:
- Size. 区域大小
- Center. 区域中心位置
- Is View Volume. 区域内是否遮挡静态物体
- Bake。参数设置:
Smallest Occluder.可成为遮挡者的最小尺寸。该参数越大,会影响划分场景的Cell的Size越大,使得影响遮挡剔除的准确性越高,但会使场景遮挡烘焙数据变大,烘焙速度变慢,运行时会好用更多的cpu进行遮挡剔除的计算。应该尽量让Cell的大小比物体的大小大个几米,同时物体的大小也不能太小。
Smallest Hole.摄像机能通过观看的最小缝隙。该参数设置越小,会导致烘焙过程越久,烘焙过程占用的内存也越大。
-
Backface Threshold.背面测试程度。100代表完全禁用背面测试,因为摄像机一般不会进入物体内部或者地下,所以通常保持100即可。
上图中是Unity的默认参数设置,一般情况下保持即可。如果需要调节,Smallest Occluder和Smallest Hole都应该以默认值位基准,从大一点的值开始往下调整,直到遮挡剔除的整体感觉没有问题。过程中如果发现遮挡剔除开始影响效率或者遮挡剔除数据太大了,则应该停止往下调整。
在默认参数的设定下,生成Cell的大小是20米,根据Cell和Object大小平衡的原则,物体大小最好不要超过15米,如果希望成为遮挡者,同时也不要小于5米。
-
效果预览。在预览面板选定摄像机:
相关性能比较
- 在出生点向对面出生点方向观看
- 默认参数设置,3个均分场景的Occlusion Area
\ | No OC | OC |
---|---|---|
Draw calls | 824 | 314 |
Total Batches | 109 | 74 |
Tris | 38.6k | 25.1k |
Verts | 54.1k | 33.4k |
VRAM usage | 15.9–31.4 MB | 15.9–27.5 MB |
CPU | 5.85ms | 5.3ms |
Camera.Render | 2.81ms | 1.72ms |
Mem-Used Total | 112.2MB | 112.1MB |
FPS | 60 | 60(锁帧) |