Skip to main content

3. 如何设置场景以实现遮挡剔除

默认情况下,Unity 会将整个场景放入一个称为会将整个场景纳入一个大型空间单元,称为 视图体积(视景体(View Volumes)的大空间块中。

通过在场景中划定特定的若在场景中放置 遮挡区域(Occlusion Area)我们可以让 Unity 仅在这些区域内进行遮挡数据的计算,从而大幅降低所需处理的遮挡数据量。如果您的场景被划分为若干独立区块,您可以使用遮挡区域来逐个覆盖这些区块,仅会计算该区域内部的遮挡数据,从而大幅减小遮挡数据量。如果你的场景被拆分为多个独立区域,建议为每个区域添加遮挡区域,而非让 Unity 对整个场景统一处理,这将会是一种更为高效的方法。将整个场景作为单个大视景体计算。

您可以在对象的静态标签或遮挡剔除的相关设置可通过两种方式配置:

  • 对象的 静态标记(Static flags)
  • Unity 编辑器中的 遮挡窗口(Occlusion window)中进行遮挡剔除的设置。

image-1643384082055.pngimage.png

遮挡剔除的简单推荐设置

只有体积大的实体对象才适合作为遮挡物。
仅将大型实心对象设为遮挡物

若物体尺寸小、透明度较高或存在空洞,则不适合作为遮挡物。例如,树木不应作为遮挡物,因为其叶片会形成许多微小空隙,这些空隙难以通过遮挡剔除准确计算;同样,边缘结构复杂的对象也不适宜作为遮挡物。这是核心原则:体积小、透明或带有孔洞的对象不应设为遮挡物。例如树木不应作为遮挡物 —— 其叶片会形成大量微小孔洞,而遮挡剔除无法精准识别这类复杂结构;边缘复杂的对象也不适合作为遮挡物。

对于始终处于可见状态的对象,无需将其纳入被遮挡物的范畴。
始终可见的对象不设为被遮挡物

例如,天空盒或由大片平面组成的海洋等,将其纳入遮挡剔除并无实际意义,而且错误地将它们判定为被遮挡物所带来的性能损失可能超过由此带来的性能收益。若场景中存在天空盒(skybox)、由巨型平面构成的海洋等必然可见的对象,无需启用其被遮挡属性。这类对象的遮挡判断会产生大量误判可见性的情况(false positives),反而抵消性能优化效果。

应该使较小的对象成为被遮挡物,而不是遮挡物。
小型对象设为被遮挡物,而非遮挡物

即使是小型对象,也可以作为被遮挡物从中获益。体积小的对象虽不适合作为遮挡物,但将其设为被遮挡物仍能通过遮挡剔除减少渲染开销,同样可提升性能。

使用“EditorOnly”标签可以创建虚拟的遮挡物。
使用 EditorOnly 标签创建假遮挡物

如果一个对象有若对象标记为 EditorOnly“EditorOnly”,其不会在游戏运行时渲染,但仍会在遮挡数据烘焙阶段被纳入计算。可利用这一特性创建仅用于遮挡计算的 标签,它不会在游戏中或运行状态下被渲染。然而,在烘焙过程中它仍会被视作遮挡物。“假遮挡物”(如场景中不可见的大型碰撞体),进一步优化遮挡判断精度。

image.png

我要如何预览遮挡剔除的效果?

在 Unity 2018 中,遮挡剔除将影响场景相机的渲染(现在也不例外)。此外,通过在遮挡窗口中选择及以上版本中,遮挡剔除效果会直接在场景视图相机(Scene 可视化(Visualization),可以从相机视角观察场景中遮挡剔除的实际运作情况。camera) 中生效;

此时,场景层级结构(Hierarchy)将被屏蔽,仅展示含相机组件的对象和当前相机视角下的遮挡剔除结果。你可以观察到相机所使用的光线投射技术,以及它是如何确定哪些物体被遮挡,和被遮挡的具体位置。此外,在遮挡窗口(Occlusion window)中选择 “可视化(Visualization)” 选项,可从场景中任意相机的视角查看遮挡剔除逻辑:包括相机发出的射线检测(raycasting)、用于判断遮挡的低精度场景模型,以及被判定为遮挡的区域。

若要恢复正常的场景显示,只需切换至遮挡窗口中的其他标签或关闭窗口即可。恢复正常场景视图的方法:切换至遮挡窗口的其他标签页,或直接关闭该窗口。

"烘焙(Bake)"设置是什么意思?

在遮挡窗口中,有一个包含了若干预设的选项和一段说明文本的部分。正如文本所指出的,这些设置已针对速度和性能进行了优化,因此不建议随意更改。遮挡窗口的 “烘焙(Bake)” 板块包含以下核心参数(Unity 默认参数已优化平衡速度与性能,通常无需修改):

最小孔洞(最小孔洞尺寸(Smallest Hole):定义几何体中 设置了被视为“孔洞”的几何间隙的阈值,可通过该孔洞看见外部。这个值越小,烘焙遮挡的时间就越长。您可以将此值设置为适合您场景的值,理想值在“可被看穿的孔洞” 的阈值。数值越小,烘焙时识别的孔洞越精细,但生成遮挡数据的耗时越长。建议根据场景尺度设置为 0.0505-0.5(单位:米,即 到 0.5 之间(5cm厘米 - 50cm)50 厘米)

最小遮挡物(最小遮挡物尺寸(Smallest Occluder) 设定了在计算遮挡时所考虑的细节等级。这个值越小,计算遮挡时会考虑更多的小物体,并且在运行计算可见内容时,遮挡的计算量会更大。将此值设置为略大于平均玩家大小的值,大约为:决定烘焙的遮挡数据对细节的保留程度。数值越小,计算时纳入的小型遮挡物越多,但运行时的可见性判断开销也会增加。建议设置为略大于平均玩家尺寸的值,通常为 2-6 米(2m 到 6m)即可。6(单位:米)。

如果你想了解更多关于它们的信息,如需深入了解这些参数的底层逻辑,可参考 请访问Unity博客上的这篇文章Unity 官方博客文章,以便更深入地解释了它们。