unity-遮挡剔除OcclusionCulling


title: unity-遮挡剔除OcclusionCulling
categories: Unity3d
tags: [unity, occlusion, culling, 性能, 优化]
date: 2019-06-04 12:52:38
comments: false

这是一个优化项, 减少看不见物体的绘制


前篇

遮挡剔除 与 摄像机的视锥体剔除 不一样, 视锥体剔除只是剔除掉视锥体之外的物体 (gpu硬件实现), 但是还是会把 顶点送入 gpu 中, 还是会经过 vertex 阶段的计算, 而视锥体之内的物体全都会绘制, 但是会有某个物体被遮挡住不需要绘制的情况, 这是时候就可以由 遮挡剔除 进一步优化 (软件实现, 自动).

最终想要的效果就是 看的到的物体 的才 送入gpu中, 看不到的物体 ( 包括 视锥体之外的 和 视锥体之内的但是被遮挡的 ) 的不送入gpu中, 这样既可以减少 cpu 到 gpu 的传输量, 也可以减少 vertex 和 frag 阶段的计算量.

比如 物体a 很大, 物体b 很小, 在很多视角下 a 都会遮挡住 b, 这时候就可以考虑把 a 标记为 Occluder Static (遮挡者), 把 b 标记为 Occludee Static (被遮挡者), 然后烘焙.

我应该在什么时候使用 Occludee Static?透明物体不能遮挡,以及小物件,都不可能阻挡其他的东西,应标记为Occludees,但不遮挡。这意味着它们将被视为能被其他物体遮挡,但不会被视为作为遮挡物自身,这将有助于减少计算量。

遮挡剔除的运行将通过在场景中使用一个虚拟的摄像机来创建一个物体潜在可视性状态(set)的层级。 这些数据可以实时让每个摄像机来确定什么能看见什么看不见。通过这些数据,Unity 将确定只把可以看见的物体送去渲染。这将降低 绘制调用(draw calls) 的数量并增加 游戏的运行效率。

遮挡剔除的数据由单元格(cells)组成, 每个单元格是在整个场景的包围体积的一部分,单元格来自一个二叉树( binary tree),遮挡剔除使用两棵树, 一个给 View Cells (静态物体) ,另一个给 Target Cells (移动物体)。 View Cells 映射到一个定义静态可视物体的索引列表 (精确剔除后的静态物体)。


使用流程

流程和 寻路区域 烘焙有点像.

  1. 先把 Occlusion 面板调出来. window -> rendering -> occlusion culling

  2. 设置场景哪些是 遮挡者 (Occluder Static) 和 被遮挡者 (Occludee Static), 有两种方式

    1. 选中物体, 在 inspector 面板中的 Static 中勾选

    2. 选中物体, 在 occlusion 面板中的 object 中勾选

  3. 添加烘焙区域. 如果不添加的话默认是烘焙整个场景. 也有两种方式创建

    1. 直接右键创建一个 gameobect, 然后挂上 Occlusion Area 组件

    2. occlusion 面板中, object -> occlusion areas, 点击 create new occlusion area (如果已选中一个 occlusion area 是不会出现这个创建按钮的)

    创建完, 调整 Occlusion Area 组件的包围盒

  4. 点击 occlusion 面板最下面的 bake 按钮进行烘焙. done.


烘焙前后对比

顶点减少

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Unity实时遮挡剔除是一种用于性能优化的技术,通过在渲染场景时动态地检测和移除被其他物体遮挡的不可见物体,提高渲染效率和帧率。 实时遮挡剔除的原理是通过摄像机的视锥体来确定被剔除的物体,只有在视锥体内的物体才会被渲染,而视锥体外的物体则会被剔除。这样可以避免不可见物体的渲染,减少对GPU、CPU和带宽的压力,提高游戏的性能和流畅度。 Unity实时遮挡剔除的步骤主要包括: 1. 确定摄像机的视锥体,即摄像机能够看到的范围。 2. 对于每个物体,判断其是否在视锥体内。如果在视锥体外,就剔除它。 3. 如果物体在视锥体内,继续检测是否被其他物体遮挡。如果被遮挡,也将其剔除。 4. 对剩下的可见物体进行渲染。 Unity实时遮挡剔除有助于提高游戏的渲染性能,尤其是在大型场景或者复杂的游戏世界中。它可以减少渲染物体的数量,加快渲染速度,使游戏更加流畅。此外,通过合理的遮挡剔除设置,还可以减少GPU和CPU的负担,让游戏在更低的硬件要求下运行。 总之,Unity实时遮挡剔除是一种重要的性能优化技术,能够提高游戏的渲染效率和帧率,为玩家提供更好的游戏体验。 ### 回答2: Unity实时遮挡剔除(Real-time Occlusion Culling)是一种用于提高游戏性能的技术,旨在减少对不可见物体的绘制。在游戏场景中,有些物体可能被其他物体遮挡,这些被遮挡的物体在渲染时不需要显示,因此可以将其剔除,从而节约计算资源。 Unity实时遮挡剔除的实现原理是通过预先计算场景中不同物体的可见性。首先,进行场景的静态分析,生成一张场景中所有物体的可见性图(Occlusion Map),记录每个点是否可见。接下来,通过相机的视锥体(视野范围),对于视锥体内的物体,通过检查其在可见性图中的位置来判断其可见性。如果物体被视锥体外的其他物体遮挡,那么它将被剔除,否则将进行渲染。 通过使用Unity实时遮挡剔除,我们可以提高游戏的渲染效率,减少不必要的绘制操作,从而改善游戏的性能和流畅度。这对于那些需要处理大量复杂场景的游戏特别有用,因为它可以在运行时动态地确定哪些物体需要渲染,减轻了GPU和CPU的负担,使游戏更加流畅。 Unity实时遮挡剔除虽然对场景的可见性进行了优化,但也有一些限制。例如,在动态物体或需要频繁更新的场景中,无法准确地预计可见性,因此需要使用其他技术进行补充,如级别细化(LOD)和动态批处理等。 综上所述,Unity实时遮挡剔除是一种采用预先计算可见性的技术,旨在提高游戏性能。通过剔除不可见的对象,减少了对它们的渲染,使游戏在复杂场景下运行更加流畅。 ### 回答3: Unity的实时遮挡剔除是一种技术,可以在场景中动态隐藏不可见的物体,从而提高渲染的效率。这个技术可以有效地避免不必要的渲染,减少GPU的负担,从而提高游戏性能。 在Unity中,实时遮挡剔除是通过一个叫做视锥裁剪器(Frustum Culling)的技术来实现的。视锥裁剪器实际上是一个虚拟的摄像机,它只渲染在视锥体内的物体。通过将在视锥体外的物体从渲染队列中剔除掉,可以减少不必要的渲染操作,提高渲染效率。 Unity的实时遮挡剔除还使用了一种叫做遮挡剔除Occlusion Culling)的技术。遮挡剔除是通过判断一个物体是否被其他物体遮挡住来进行的。当一个物体被其他物体遮挡住时,该物体的渲染操作就会被剔除掉,从而减少不必要的渲染。 Unity的实时遮挡剔除在编辑器中可以通过配置设置来应用。通过在场景中添加遮挡剔除区域,可以指定哪些物体应该被剔除。而且,Unity还提供了一些调试工具,可以帮助开发者进行优化,如场景的可视化遮挡剔除图和性能分析器。 总之,Unity的实时遮挡剔除是一种有效的渲染优化技术,可以提高游戏性能,减少不必要的渲染。通过视锥裁剪器和遮挡剔除的配合使用,可以在保证画面质量的同时提高游戏的帧率和流畅度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蝶泳奈何桥.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值