【Unity3D】遮挡剔除 Occlusion
目录
一、实现方法
二、为什么遮挡剔除无效,仅有视椎体剔除生效?
三、关于Occlusion Area组件的影响
四、动态遮挡物体 Occlusion Portal
参考文档:遮挡剔除 - Unity 手册
一、实现方法
版本:Unity 2021.2.7f1c1
位于射线前创建若干个立方体,将最前面的立方体放大遮挡住后面的立方体。
打开Occlusion面板
可单独选中遮挡物:勾选Occluder Static,将其变为遮挡静态物体
其他被遮挡物体则勾选Occludee Static
然后点击Bake,之后选中Main Camera 并点击进入Visualization
勾选Occlusion culling开启遮挡剔除,就生效了。
遮挡剔除包含2个部分的剔除,1、剔除视椎体之外的物体。2、剔除被挡住的物体。
如果你所有物体都可以是遮挡物体和被遮挡物体,那么Occludee Static、Occluder Static都要勾选
注意事项:
Smallest Occluder(最小的遮挡物体大小)设置太小会导致Bake数据增大,一般设置合适的遮挡物大小即可(默认是5)
Smallest Hole(最小的洞大小):是指那种镂空物体的洞如果想看到洞背后的物体,那么这个值必须比这个洞大小要小,也就是小于这个Smallest Hole大小的洞背后的物体都会被剔除掉。
Backface Threshold:官方解释一般不要动,保持100。
Unity 的遮挡使用数据大小优化功能,通过测试背面来减少不必要的细节。默认值 100 比较稳妥,绝不会从数据集删除背面。值 5 将基于具有可见背面的位置大幅减少数据。思路是,一般情况下,有效的摄像机位置通常不会看到太多背面;例如,地形底面的视图,或者您应该无法到达的实体对象内的视图。如果阈值低于 100,Unity 将完全从数据集删除这些区域,从而减少遮挡的数据大小。
如果想再次Bake,必须先进行Clear,再Bake 否则旧的数据会影响而出现Bug。
二、为什么遮挡剔除无效,仅有视椎体剔除生效?
这是正常的Bake生成的空间数据(八叉树空间)用于快速搜索出可视物体和不可视物体的。
可以看到粒度足够小,因为我将Smallest Occluder调整成0.5大小就能遮挡,所以它会创那么细。
如果你将这个值调到超出了最大遮挡物体的大小,比如10.
那么肯定就会导致有些不能看到的物体,被看到了,而无法实现遮挡剔除,因为蓝色立方体变大了,它就更不准确地表达出这个物体的实际可视情况。它就会出现问题,如下:
其次就是Unity的Clear和Bake,当你调整了Smallest Occluder值后去重新Clear和Bake可能会无法正确生成蓝色格子,你必须确保蓝色格子正常生成才能恢复正常的遮挡剔除,如果保证?多点几次Clear和Bake 并且不要频繁地点,它是要等待执行的。
为什么你蓝色区域正确生成了,摄像机依然无法正常遮挡剔除?
因为摄像机并没有在蓝色区域空间内,无法正常执行遮挡剔除...
解决办法:在摄像机背后远处创1个立方体,同样要设置为Occludee Static或Occluder Static,然后再次Clear和Bake,保证摄像机是处于蓝色区域空间内的。如下是我创了几个在后面,实际1个就可以。
(实际上可利用Occlusion Area组件去创建正常的蓝色区域,必定包含摄像机的,下面有说明)
三、关于Occlusion Area组件的影响
创建一个空物体,挂载Occlusion Area组件,并且该物体不能是静态的,确保勾选Is View Volume
这个区域会影响蓝色区域的生成,具体如何影响不清楚,如果你创了一个这样的物体,并且这个区域没有包含任何静态物体,那么蓝色区域会变成如下,就会导致遮挡剔除无效了一样。
你必须包含住所有的物体才正常。
关于这个组件的应用目前还未了解到,猜测是方便快速剔除某一大块区域的,也就是不局限于物体的大小去做蓝色区域,可以自定义一个整体块再去做蓝色区域,加速剔除效率?
四、动态遮挡物体 Occlusion Portal
创建一个立方体,挂载Occlusion Portal组件,取消Open勾选项【不要设置为静态物体】
然后重新Clear和Bake,这个物体就成为了动态遮挡物体,利用Open勾选项,确定是否开启遮挡,如果Open是False代表开启遮挡(关门遮挡),Open是True则关闭遮挡(开门不遮挡)
演示效果:(中间很大那块就是动态遮挡物体)
如下左图是Open为False(开启遮挡),右图是Open为True(关闭遮挡)