unity学习之遮挡剔除

基本概念:

“遮挡剔除”过程可防止 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. 1.确保 Occlusion Culling 窗口和 Scene 视图均为可见状态。当 Occlusion Culling 窗口可见时,Unity 在 Scene 视图中显示遮挡剔除数据和 Occlusion Culling 弹出窗口。
  2. 在场景中选择一个摄像机。
  3. 移动摄像机,观察 Scene 视图。当由于视锥体剔除或遮挡剔除而导致摄像机无法看到游戏对象时,您应该会看到游戏对象从视图中消失。
  4. 使用 Scene 视图中的 Occlusion Culling 弹出窗口来配置可视化设置。
  5. 如果需要,请调整 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 组件置于其表示的游戏对象上。

在场景中设置遮挡入口:

  1. 选择场景中的合适游戏对象来充当遮挡入口。适合作为遮挡入口的游戏对象包括中型到大型的实体游戏对象(例如门)。
  2. 确保未将此游戏对象标记为 Occluder Static 或 Occludee Static。
  3. 将 Occlusion Portal 组件添加到游戏对象。
  4. 烘焙场景的遮挡数据。
  5. 确保 Occlusion Culling 窗口、Inspector 面板和 Scene 视图均为可见状态。
  6. 在 Scene 视图中,将摄像机移至遮挡入口正前方的位置。
  7. 选择具有 Occlusion Portal 组件的游戏对象。
  8. 在 Inspector 窗口中,开启和关闭 Occlusion Portal 组件的 Open 属性。在 Scene 视图中,观察遮挡剔除的差异。

在运行时打开和关闭遮挡入口:

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
    …
}

完结!

猜你喜欢

转载自blog.csdn.net/liu_xueping/article/details/123407498