Unity遮挡剔除特性的说明
Unity遮挡剔除特性的说明
一. 遮挡剔除简述
功能:遮挡剔除功能可以降低被渲染对象个数,从而降低每帧渲染时间。
原理:避免对因为完全被其他物体挡住而不可见的物体的渲染。
说明:U3D遮挡剔除是一个object-level剔除特性,基于PVS.
二. Unity遮挡剔除功能的使用方法简介
Unity也支持对动态物体的遮挡剔除。但是本文后面的部分只关注对于静态对象的遮挡剔除特性。
使用Unity的遮挡剔除功能大概需要做下面三件事情:
Step1:设置场景中哪些物体会遮挡其他物体(遮挡物occluder)
Step2:设置场景中那些物体需要做可见性查询,即确定哪些物体很可能被其他物体挡住(被遮挡物occludee)
Step3:烘培遮挡剔除数据,供游戏运行时使用。
编辑器中要进行相关操作前,需要开启Occlusion Culling窗口,参见图1.
图1
三. Unity遮挡剔除功能的使用方法详述
(1) 设置对象为遮挡物or被遮挡物
选中某个对象后,在其Occlusion窗口可以设置其Occluder Static和Occludee Static属性,参见下图:
图2
l 遮挡物
通过勾选一个对象的Occluder Static(参见图2)可将其设置为静态遮挡物。理想的遮挡物应该是实心的,体积较大的物体。
原则1:可能阻挡到其它对象的对象才应该被设置为遮挡物。一些远景物体不要设置成遮挡物,否则很可能会导致剔除数据成倍增长以及运行时剔除查询效率降低。另外半透明的物体也不应设置为遮挡物。
原则2:对于某些带类似小孔的物体(例如网,树叶茂盛的树木),可以不将其设置为遮挡物,这样可以避免得到不正确的结果。(smallest hole参数可以处理这种情况但是其值不宜设得太小)
l 被遮挡物
通过勾选一个对象的Occludee Static(如上图)可将其设置为静态被遮挡物。
理想的被遮挡物应该是体积较小的,这样它被完全遮挡到的情况才会比较多,因此做遮挡剔除查询才比较有意义。但是如果将对象拆分得过小,也会导致遮挡剔除性能下降。
较大的物体不宜设成被遮挡物(例如在3dMax里合并了之后再倒入到Unity编辑器),但是请注意到被U3D做batch之后渲染的多个mesh在做遮挡剔除时还是会针对单个mesh分别进行,所以不受影响。
(2) 烘培
在Occlusion窗口的Bake页面进行对场景的遮挡剔除数据的烘培。参见下图。
参数设置:
烘培参数的调整本质来说是剔除准确性和性能/效率的折中。在实践中,图3所示的三个参数值都应该从一个较大的值开始,不断调小,直到得到满意的结果。当你发现烘培时间过长或者烘培数据过大时,就应该尝试调大参数。
图3
l Smallest Hole
解释:如果场景中有带孔的物体需要能被视线穿透(例如墙上的洞, 房间的门),那么需要将Smallest Hole设置为小于孔的直径
原则:在不出现剔除错误(可见的物体被剔除了)的情况下,应该尽量将该值设大些。
建议值:0.05~0.50
图4
l Smallest Occluder
解释:顾名思义,就是场景内最小遮挡物的尺寸。设得过大会导致剔除成功率下降(但是应该不会产成剔除错误),过小会导致性能问题。
原则:设置为比Player高度略大的值。目前Player高度大概为1.8.
建议值:2~6
图5
l Backface threshold
解释:本参数的引入是为了减少剔除数据大小,另一方面,设置不当会导致剔除错误(可见的物体被剔除了)。因此,暂时请保持默认值100不变。
说明:工作机制是如果PVS产生的某个cell中观察到的阻挡面是backface的比例大于设定值,那么生成的剔除数据中将不会包含这个cell相关内容,从而降低了数据大小。如果运行时camera移动到该cell内,那么剔除查询结果将会是“Undefined”。
(3) 遮挡剔除结果的验证
烘培进行完成后,可以在Bake页面最下方查看遮挡剔除数据大小,参见图7。遮挡剔除的结果可以在Scene窗口内实时查看。
具体方法如下:
l 选中visualization页面,参见图8。
l 选中场景内的某个摄像机,勾选它的Occlusion Cullling选项,参见图8。
l 移动或旋转摄像机的位置,场景内的物体则会被实时剔除掉。需要注意的是,这是视锥剔除(frustum culling)和遮挡剔除共同作用的结果
图7
图8
四. 参考资料
http://docs.unity3d.com/Manual/OcclusionCulling.html
http://blogs.unity3d.com/2013/12/02/occlusion-culling-in-unity-4-3-the-basics/
http://blogs.unity3d.com/2013/12/26/occlusion-culling-in-unity-4-3-best-practices/
http://blogs.unity3d.com/2014/01/02/occlusion-culling-in-unity-4-3-troubleshooting/