【问题标题】:Occlusion Culling in UnityUnity 中的遮挡剔除
【发布时间】:2021-12-03 09:41:47
【问题描述】:

我在 Unity 中使用遮挡剔除,它适用于相机的旋转。但是,假设相机视野前方有一堵大墙,而墙后有许多物体。现在因为这些对象在相机的方向,它们不会被剔除,即使它们在相机的视野中不可见。 我的问题是,在这种情况下,遮挡剔除是否可以隐藏相机视野中被遮挡的对象?

【问题讨论】:

  • 这真的取决于你的遮挡剔除设置。您应该调整它们并通过测试检查结果。根据我的个人经验,默认设置在大多数情况下都能正常工作,但并非总是如此。另外,Unity 的默认遮挡剔除并不是最好的,所以也要记住这一点。

标签: unity3d


【解决方案1】:

如需更详尽的解释,请通读以下内容;如果您想直截了当,请跳到最后。

说明:根据统一文档,这就是遮挡剔除的工作方式:

遮挡剔除会在 Unity 编辑器中生成有关场景的数据,然后在运行时使用该数据来确定相机可以看到的内容。生成数据的过程称为烘焙。

当您烘焙遮挡剔除数据时,Unity 会将场景划分为单元格并生成描述单元格内几何形状以及相邻单元格之间可见性的数据。 Unity 然后在可能的情况下合并单元格,以减少生成数据的大小。要配置烘焙过程,您可以在 Occlusion Culling 窗口中更改参数,并在场景中使用 Occlusion Areas。

在运行时,Unity 将这些烘焙数据加载到内存中,并且对于启用了 Occlusion Culling 属性的每个相机,它会针对数据执行查询以确定相机可以看到的内容。请注意,启用遮挡剔除后,相机会同时执行视锥体剔除和遮挡剔除。

更多关于遮挡剔除的信息可以在这里找到unity's doc on culling

因此,基本上,Unity 使用这些烘焙数据来确定是否应该剔除游戏对象;但这仅适用于静态游戏对象。看看 unity 如何也可以剔除动态游戏对象:

要确定动态游戏对象是否充当被遮挡物,您可以在任何类型的渲染器组件上设置动态遮挡属性。启用动态遮挡后,当静态遮挡将渲染器挡在相机的视野中时,Unity 会剔除渲染器。当动态遮挡被禁用时,当静态遮挡将渲染器挡在相机的视野中时,Unity 不会剔除渲染器。

更多关于统一剔除动态游戏对象的信息可以在这里找到:Using occlusion culling with dynamic GameObjects

使用遮挡剔除窗口,您应该烘焙统一所需的数据以启用遮挡剔除occlusion culling window

结论:所以为了剔除墙后的敌人,墙,“遮挡物”,应该是一个静态的游戏对象,你的敌人,“被遮挡物”应该有Dynamic Occlusion 在他们的渲染器上启用,Occlusion culling 应该在你的相机上被激活,并且应该为你的场景烘焙遮挡剔除数据。

【讨论】:

  • 嘿,是的,我已经完成了the "Occluder", should be a static game object, your enemies, the "occluded"s should have Dynamic Occlusion enabled on their renderer, and the Occlusion culling should be activated on your camera.,但是当相机在它前面时它们不会被遮挡。
  • 我无法想象您的场景。摄像头在什么前面?
  • 你为你的场景烘焙了遮挡剔除数据吗?我更新了我的答案。检查一下。
  • 好的,我所做的就是将“最小遮挡物”更改为 2。这样,最近的物体就会被遮挡。
  • 在层次结构中选择相机的同时使用可视化选项卡来查看相机正在剔除什么。
【解决方案2】:

我在 unity 2017、2019 和 2020 中遇到了同样的问题。

当遮挡器的世界位置的每个轴都在蓝线上并且我的最小遮挡器设置为 2 时,就会发生这种情况。

我通过使遮挡物不在蓝线上解决了这个问题。

【讨论】:

    猜你喜欢
    • 2011-06-27
    • 2014-09-22
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多