Unity遮挡剔除特性的说明

发表于2015-09-18
评论3 1.48w浏览

Unity遮挡剔除特性的说明

 

一.   遮挡剔除简述

功能:遮挡剔除功能可以降低被渲染对象个数,从而降低每帧渲染时间。

原理:避免对因为完全被其他物体挡住而不可见的物体的渲染。

说明:U3D遮挡剔除是一个object-level剔除特性,基于PVS.

 

二.   Unity遮挡剔除功能的使用方法简介

Unity也支持对动态物体的遮挡剔除。但是本文后面的部分只关注对于静态对象的遮挡剔除特性。

 

使用Unity的遮挡剔除功能大概需要做下面三件事情:

Step1:设置场景中哪些物体会遮挡其他物体(遮挡物occluder

Step2:设置场景中那些物体需要做可见性查询,即确定哪些物体很可能被其他物体挡住(被遮挡物occludee

Step3:烘培遮挡剔除数据,供游戏运行时使用。

 

编辑器中要进行相关操作前,需要开启Occlusion Culling窗口,参见图1.

1

 

三.   Unity遮挡剔除功能的使用方法详述

(1)       设置对象为遮挡物or被遮挡物

选中某个对象后,在其Occlusion窗口可以设置其Occluder StaticOccludee Static属性,参见下图:

2

l  遮挡物

通过勾选一个对象的Occluder Static(参见图2)可将其设置为静态遮挡物。理想的遮挡物应该是实心的,体积较大的物体。

原则1:可能阻挡到其它对象的对象才应该被设置为遮挡物。一些远景物体不要设置成遮挡物,否则很可能会导致剔除数据成倍增长以及运行时剔除查询效率降低。另外半透明的物体也不应设置为遮挡物。

原则2:对于某些带类似小孔的物体(例如网,树叶茂盛的树木),可以不将其设置为遮挡物,这样可以避免得到不正确的结果。(smallest hole参数可以处理这种情况但是其值不宜设得太小)

l  被遮挡物

通过勾选一个对象的Occludee Static(如上图)可将其设置为静态被遮挡物。

理想的被遮挡物应该是体积较小的,这样它被完全遮挡到的情况才会比较多,因此做遮挡剔除查询才比较有意义。但是如果将对象拆分得过小,也会导致遮挡剔除性能下降。

较大的物体不宜设成被遮挡物(例如在3dMax里合并了之后再倒入到Unity编辑器),但是请注意到被U3Dbatch之后渲染的多个mesh在做遮挡剔除时还是会针对单个mesh分别进行,所以不受影响。

 

(2)       烘培

Occlusion窗口的Bake页面进行对场景的遮挡剔除数据的烘培。参见下图。

参数设置:

烘培参数的调整本质来说是剔除准确性和性能/效率的折中。在实践中,图3所示的三个参数值都应该从一个较大的值开始,不断调小,直到得到满意的结果。当你发现烘培时间过长或者烘培数据过大时,就应该尝试调大参数。

3

l  Smallest Hole

解释:如果场景中有带孔的物体需要能被视线穿透(例如墙上的洞, 房间的门),那么需要将Smallest Hole设置为小于孔的直径

原则:在不出现剔除错误(可见的物体被剔除了)的情况下,应该尽量将该值设大些。

建议值:0.050.50

4

l  Smallest Occluder

解释:顾名思义,就是场景内最小遮挡物的尺寸。设得过大会导致剔除成功率下降(但是应该不会产成剔除错误),过小会导致性能问题。

原则:设置为比Player高度略大的值。目前Player高度大概为1.8.

建议值:26

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/

 

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论