Unity渲染工作原理--和instantOC插(减少CPU 和 GPU的工作量)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity渲染工作原理--和instantOC插(减少CPU 和 GPU的工作量)相关的知识,希望对你有一定的参考价值。

参考技术A 工作顺序原理:

CPU决定哪些需要渲染,GPU渲染工作;所以他们都要工作

当然啦,要画面中被遮挡的东西多才用

使用方法:导入包Pakage之后,就把IOCcam文件放到 摄像机上面去

就是unity根据物体的 点面数量、在场景中的位置、决定渲染资源的分配

使用InstantOC实现动态遮挡剔除 + LOD效果

资源的unity地址:
https://assetstore.unity.com/packages/tools/camera/instantoc-dynamic-occlusion-culling-lod-6391
由于资源比较老了,所以我修改了一个2020版本的urp渲染管线的版本,大家可以按需拿取。

具体效果如图

接下来说一下,如何使用插件实现当前功能。
首先把资源解压到项目中。

里面有所有的相关资源,并且还有readme的pdf,这是官方的文档,如果英语水平比较好的,可以直接看官方文档。
里面包含的内容:IOC 的 4 个核心组件(“IOCcam”、“IOClod”、“IOClight”、“IOCterrain”)
“IOChud” Prefab(这个是一套ui,你可以在运行场景时,通过这一套ui进行调试配置)
一个示例demo场景,用于查看效果。

最简单的使用方式:

  1. 在相机上面添加“IOCcam”脚本

    这是官方demo的配置,后面会有每个属性的设置。
  2. 在相机上设置Occludee Layer ,希望脚本处理的游戏对象的层。
  3. 给对象设置标签,并同时在相机标签上设置,或者将“IOClod”脚本直接添加到对象上面,两者都会最终生成“IOClod”脚本到对象上面。此脚本可以覆盖在相机脚本上设置的lod的设置,可以强制当前对象使用“LOD only”,将此对象设置成遮挡体,开启static。
  4. 确保meshRender的对象上面有碰撞器用于检测,(此功能也是通过碰撞检测实现的功能)如果不使用mesh Collider脚本,使用的像Box Collider,那么请确保打开Is Trigger选项,可以触发碰撞检测事件。

    如果你的对象是静态的,你最好勾选Static,这样可以节约大约一般的性能,远处的小型对象启用,通常也能减少 忽闪忽闪的问题。在只能以更少的“Ray Samples”实现相同的质量的遮挡剔除在WebGL和移动平台上特别有用。
    如果启用了 Occludee 属性,对象被其它对象遮挡时将隐藏掉,但它不会遮挡其它对象,这个属性可以在当前物体是半透明物体时打开。
    如果设置了LodOnly,对象将始终显示,会根据你设置的距离切换lod级别。

要在 InstantOC 中设置遮挡物,您需要执行以下操作:
• 创建一个特定Layer(InstantOC 将自动使用该层)
• 从“Occludee Layer”下拉列表中选择“IOCcam”脚本中的这一层
• 在要成为被遮挡物的对象的“IOClod”脚本上启用“Occludee”
• 将遮挡物放在由 InstantOC 管理的层上(不是您在第一步中创建的层!)

“IOCcam” 脚本配置项设置

TAG(tag1,tag2)
填写需要自动添加IOClod脚本的对象的tag,多个用逗号分隔。如果tag匹配,会自动添加脚本。如果你需要单独设置物体的配置,需要手动挂载IOClod,并设置相关配置。

Layer mask
设置需要使用InstantOC 管理的游戏对象/预制体所在的层,如果你给物体添加了IOClod,但不在管理的层,那么,它将不会显示,所以,最简单的方法就是设置everting,或者把需要设置的物体都放到一个Layer里面。

Occludee Layer
一个用于存放被遮挡不显示物体的层,这个层应该不在InstantOC的Layer mask的层里面。当物体被射线检测到,将被移动到此层上面,如果物体无法被射线检测到,将会被移回默认的层。

Samples
每次更新遮挡物的显示隐藏时,检测射线的数量,数量越多,检测的结果就越精确,但同时会需要更多的性能消耗。通常设置的值在150到500之间,但特定的情况下有很多不确定因素:比如目标平台,游戏对象的尺寸和形状以及和相机的距离。
我们可以尝试不同值来达到性能和效果平衡。

Rays FOV
射线检测的相机的FOV值,这个值一般会设置的比默认相机的值要大,可以减少相机可视边界的物体产生闪烁的问题。
比如:你的相机fov是60,那么你可以将这个值设置成65或70,会发现相机边界闪烁问题减少很多。

View Distance
射线的长度。更远的物体保持隐藏状态。

Hide Delay
延迟隐藏,一个对象不显示时,会延迟隐藏的帧数,比较友善的值在50-100.如果远处的对象闪烁过多,可以尝试提高此值,或者修改Samples。

PreCull Check
预剔除检查,开启将减少远处或者小物体的闪烁效果。选中后,视锥体中将要隐藏自己的对象将快速检查它们是否仍然可以从相机中看到,如果是,它们将延迟隐藏。它非常轻巧且经过优化,您可以始终启用它而无需担心。

Realtime Shadows
如果您的场景中有实时阴影,请启用此选项;这种方式被遮挡(不可见的物体)将在需要时正确投射阴影。

Lod 1 distance
如果游戏对象/预制件有 2 级 LOD(请参阅下一节了解 LOD 详细信息),InstantOC 将按如下方式渲染 LOD:
• Lod_0 如果与相机的距离 >= 0 并且 < Lod 1 距离
• Lod_1 如果与相机的距离 >= Lod 1 距离
您可以通过“IOClod”脚本选项覆盖特定游戏对象/预制件的此值。

Lod 2 distance
如果游戏对象/预制件有 3 级 LOD(请参阅下一节了解 LOD 详细信息),InstantOC 将按如下方式渲染 LOD:
• Lod_0 如果与相机的距离 >= 0 并且 < Lod 1 距离
• Lod_1 如果与相机的距离 >= Lod 1 距离并且 < Lod 2 距离
• Lod_2 如果与相机的距离 >= Lod 2 距离
您可以通过“IOClod”脚本选项覆盖特定游戏对象/预制件的此值。

Light Probes
这是 InstantOC 在启动时为执行灯光遮挡剔除创建的每个灯光的探测器数量。探针是设置为“Is Trigger”的简单球体对撞机,更多探针→更精确的结果。
对于聚光灯,30 是一个很好的起始值,如果您的聚光灯角度非常宽,请使用更多探头(50 - 70)。
对于点光源,稍高的值 (90 – 100) 通常会产生更好的效果。
InstantOC 在启动时为所有带有 IOC TAG 的灯光生成所有探针,因此过多的探针可能会延长启动时间(特别是如果您的场景中有大量灯光)。
您可以通过“IOClight”脚本选项覆盖特定灯光的此值。

Probe Radius
这是探针的半径(球体碰撞体半径)。
将此设置为 0.2 – 1.0 之间的值。
探针半径越大,需要的探针越少(初始化越快),但太大的探针会干扰网格遮挡剔除。
为获得最佳结果,您必须在探头数量和探头半径之间找到适当的平衡。
您可以通过“IOClight”脚本选项覆盖特定灯光的此值。

“IOClod” script

Static
如果对象是静态的,就是不会移动的物体,则勾选此选项。射线检测大约会减少一半性能。

Occludee
在半透明对象上开启此选项。

Lod 1 distance
请参阅“IOCcam”脚本。

Lod 2 distance
请参阅“IOCcam”脚本。

Lod Margin
从 3.0.0 版本开始,Lod Margin 由 InstantOC 自动计算,因此您通常无需担心。 如果您需要手动设置,请在此处进行。
该值为前 2 个(Lod 1 距离和 Lod 2 距离)提供了一些余量
通常最好将其设置为接近游戏对象最长边的值,如果发生一些闪烁(在 LOD 阶段之间),请尝试将其提高一点。


LOD
InstantOC 包括一个集成的 LOD 系统,最多支持 3 个 LOD 级别。
它比内置的基于距离的LOD更有效,因为它是基于光线的,不但可以渲染远处物体的低细节版本,还可以实现近处的但被遮挡的物体的隐藏功能(从当前相机看不到),从而避免浪费渲染时间。
要创建 InstantOC LOD 游戏对象/预制件,请执行以下操作:
• 创建一个空的游戏对象并根据需要命名
• 在其中拖放 2 或 3 个游戏对象并将它们命名为“Lod_0”、“Lod_1”、“Lod_2”
• 将“IOClod”脚本添加到父游戏对象
• 确保至少有一个 Collider 连接到父游戏对象或其中一个 Lod 子对象
包含碰撞体的对象,必须处于InstantOC管理的图层之一上面(在相机“IOCcam”脚本的“Layer mask”配置项里面)

Lights Occlusion Culling
InstantOC 灯光遮挡剔除基于灯光探测器。
在启动时,它会为您希望由 InstantOC 管理的每盏灯创建一些探测器。
探针是随机放置在光的影响区域中的小球体对撞机(仅限触发器)。
对于聚光灯,它是一个圆锥体,对于点光源,它是一个球体。
InstantOC 考虑了几个参数,如光照范围、锥角和障碍物,以便仅将探头有效地放置在表面真正受光影响的地方。
当 InstantOC 光线投射器“感应”到这些探测器时,它会激活相应的灯光,这始终只启用那些真正有助于当前视图的灯光。
对于特殊情况,您还可以通过手动将一些探针准确地放置在您想要的位置来微调您的灯光;只需将一个或多个“探针”预制件(InstantOC/Resources/ 文件夹)拖放到您的场景中,并使其成为您正在微调的灯光的子对象。
支持的光源是点光源和聚光灯。
要为灯光启用灯光遮挡剔除,请执行以下操作:
• 在您的灯上设置 IOC TAG
• 将灯光放在由 InstantOC 管理的图层上
• 在“IOCcam”脚本上设置灯光遮挡剔除选项(“Probes”、“Probe radius”)
如果您想覆盖特定灯光的选项,只需手动将“IOClight”脚本添加到灯光,并在那里设置首选值(“探针”、“探针半径”)。

Terrain Occlusion Culling
从版本 2.1.0 开始,InstantOC 完全支持地形遮挡剔除。
您将需要多个地形,或者通过使用某些实用程序(例如“地形切片和动态加载套件”)对一个大地形进行切片,或者从多个地形从头开始。
要启用 Unity 地形遮挡剔除,请执行以下操作:
• 在您的地形上设置 IOC TAG(或手动添加“IOCterrain”脚本)
• 将地形放在由 InstantOC 管理的图层上

IOChud Prefab
“IOChud” Prefab 是一个帮助对象,可让您在运行时微调 InstantOC 选项。
将其拖动到层次结构面板中,然后点击“播放”。
最终值,您必须在“IOCcam”自定义检查器中重新输入它们。

以上是关于Unity渲染工作原理--和instantOC插(减少CPU 和 GPU的工作量)的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D之InstantOC(遮挡剔除)

使用InstantOC实现动态遮挡剔除 + LOD效果

使用InstantOC实现动态遮挡剔除 + LOD效果

使用InstantOC实现动态遮挡剔除 + LOD效果

Unity学习笔记4:遮挡剔除LODProfiler光照声音

Unity学习笔记4:遮挡剔除LODProfiler光照声音