基本概念:
“遮挡剔除”过程可防止 Unity 为那些被其他游戏对象完全挡住(遮挡)的游戏对象执行渲染计算。
说白了就是如果摄像机看不见的物体,我就不用去管它了(渲染)。
遮挡剔除 我认为其实也是一个空间换时间的方法,做项目的时候可以结合遮挡区域、遮挡入口灵活运用。
遮挡剔除的效果展示:
未开启遮挡剔除
开启遮挡剔除
遮挡剔除的工作原理:
遮挡剔除会在 Unity Editor 中生成有关场景的数据,然后在运行时使用该数据来确定摄像机可以看到的内容。这种生成数据的过程称为烘焙。
在对遮挡剔除数据进行烘焙时,Unity 将场景划分为多个单元,并生成描述单元内几何体以及相邻单元之间可见性的数据。然后,Unity 尽可能合并单元,以减小生成的数据的大小。要配置烘焙过程,可以在 Occlusion Culling 窗口中更改参数,并在场景中使用遮挡区域。
在运行时,Unity 会将这些烘焙的数据加载到内存中,并且对于每个启用了 Occlusion Culling 属性的摄像机,将会对数据执行查询以确定该摄像机可以看到的内容。请注意,启用遮挡剔除后,摄像机将执行视锥体剔除和遮挡剔除。
如何使用静态遮挡剔除:
使用遮挡剔除一定要在相机的Inspector窗口勾选Occlusion Culling
- 静态遮挡物限定:具有 Terrain 或 Mesh Renderer 组件、不透明、运行时不移动
- 静态被遮挡物限定:具有任何类型的 Renderer 组件、运行时不移动
第一步设置被遮挡物和遮挡物:
静态遮挡物的所有游戏对象,设为Occluder Static,被静态遮挡物的所有游戏对象,设为Occludee Static。
第二步烘焙遮挡数据:
在顶部菜单中,选择 Window > Rendering > Occlusion Culling 以打开 Occlusion Culling 窗口。 2.选择 Bake 选项卡。 3.在 Inspector 窗口的右下角,按 Bake 按钮。Unity 会生成遮挡剔除数据,将数据另存为项目中的资源,并将该资源与当前场景关联。
第三部查看遮挡效果:
- 1.确保 Occlusion Culling 窗口和 Scene 视图均为可见状态。当 Occlusion Culling 窗口可见时,Unity 在 Scene 视图中显示遮挡剔除数据和 Occlusion Culling 弹出窗口。
- 在场景中选择一个摄像机。
- 移动摄像机,观察 Scene 视图。当由于视锥体剔除或遮挡剔除而导致摄像机无法看到游戏对象时,您应该会看到游戏对象从视图中消失。
- 使用 Scene 视图中的 Occlusion Culling 弹出窗口来配置可视化设置。
- 如果需要,请调整 Occlusion Culling 窗口的 Bake 选项卡中的烘焙设置,然后重复烘焙过程。
对动态游戏对象使用遮挡剔除 :
游戏对象可以是静态的,也可以是动态的(非静态)。静态游戏对象和动态游戏对象在 Unity 的遮挡剔除系统中的行为不同:
- Unity 可以将静态游戏对象作为静态遮挡物和/或静态被遮挡物烘焙到遮挡剔除数据中。
- Unity 无法将动态游戏对象烘焙到遮挡剔除数据中。动态游戏对象可以在运行时充当被遮挡物,而不能充当遮挡物。
如何启用动态遮挡剔除?
在对象的Inspector窗口勾选 Dynamic Occlusion,新建时默认已经勾选。
Tip:如果确定 Unity 绝对不应该将遮挡剔除应用于特定的游戏对象,则可以禁用 Dynamic Occlusion 以减少运行时计算并降低 CPU 使用率。
遮挡区域
使用 Occlusion Area 组件可以定义遮挡剔除系统中的视图体积。视图体积是摄像机可能处于运行时的场景区域。在烘焙时,Unity 在视图体积内生成更高精度的数据。在运行时,当摄像机位于视图体积内的时候,Unity 进行更高精度的计算。
如果尚未在场景中定义任何视图体积,Unity 将在烘焙时创建一个视图体积,其中包含标记为 Occluder Static 或 Occludee Static 的所有场景几何体。在大型或复杂场景中,这可能导致不必要的大量数据、漫长的烘焙时间以及资源密集的运行时计算。为了避免发生这种情况,请将遮挡区域 (Occlusion Areas) 放置在场景中,从而定义摄像机可能处于的区域的视图体积。
可以给一个空物体挂载Occlusion Area组件,记得勾选 Is View Volume。
遮挡入口
遮挡入口 (Occlusion Portal) 可以是打开或关闭状态。遮挡入口关闭时,它将遮挡其他游戏对象。遮挡入口打开时,它不会遮挡其他游戏对象。列如: 门打开或者关闭
无需将 Occlusion Portal 组件置于其表示的游戏对象上。
在场景中设置遮挡入口:
- 选择场景中的合适游戏对象来充当遮挡入口。适合作为遮挡入口的游戏对象包括中型到大型的实体游戏对象(例如门)。
- 确保未将此游戏对象标记为 Occluder Static 或 Occludee Static。
- 将 Occlusion Portal 组件添加到游戏对象。
- 烘焙场景的遮挡数据。
- 确保 Occlusion Culling 窗口、Inspector 面板和 Scene 视图均为可见状态。
- 在 Scene 视图中,将摄像机移至遮挡入口正前方的位置。
- 选择具有 Occlusion Portal 组件的游戏对象。
- 在 Inspector 窗口中,开启和关闭 Occlusion Portal 组件的 Open 属性。在 Scene 视图中,观察遮挡剔除的差异。
文章来源:https://www.toymoban.com/news/detail-407004.html
在运行时打开和关闭遮挡入口:
void OpenDoor() {
// Toggle the Occlusion Portal's open state, so that Unity renders the GameObjects behind it
myOcclusionPortal.open = true;
// Call a function that plays a door opening animation, or otherwise hides the GameObject
…
}
完结!文章来源地址https://www.toymoban.com/news/detail-407004.html
到了这里,关于unity学习之遮挡剔除的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!