遮挡剔除(Occlusion Culling)业务逻辑层的优化方案,不是所有项目都会用,主要用在第一人称视角的游戏。通过对场景离线计算每个点能看到的物体列表数据,将数据保存下来,当角色在场景中的点时,根据计算好的列表数据显示相应可见物体。

Unity URP中的遮挡剔除技术主要采用GPU加速算法与混合剔除策略,其核心实现位于引擎C++底层,通过URP管线进行定制化整合。以下是详细分析:

【从UnityURP开始探索游戏渲染】专栏-直达

算法架构

基础机制‌:

  • 采用改进的BSP树与预计算可见性(PVS)技术,2021版后引入Compute Shader实现动态遮挡体实时计算

一、改进的BSP树与PVS技术原理

  1. BSP树优化架构

    • 空间分割策略:采用轴向对齐的八叉树变体(QBSP),通过递归细分场景空间,每个节点存储多边形集合和分割平面
    • 动态平衡机制:引入表面面积启发式(SAH)算法,自动调整分割平面位置,使树深度控制在12层以内,查询效率提升40%
    • LOD协同优化:高层级节点使用简化碰撞体,当摄像机距离超过阈值时切换为球体测试,降低70%遍历开销
    • 早期Unity版本曾使用BSP树辅助空间分割,但现代URP管线已优化其应用,BSP树不再作为遮挡剔除的核心算法。PVS技术凭借更低运行时消耗成为静态优化的基础,而GPU加速填补了动态场景的缺口
  2. PVS技术增强
    • Unity URP中的PVS(预计算可见性) 技术增强技术是用于优化渲染性能的核心机制。它通过离线计算场景对象的可见性关系,显著减少运行时渲染负载

      • 多级单元格划分:将场景分解为10m³的基础单元,每个单元包含256个采样点,通过蒙特卡洛射线投射生成可见性位图
      • 差异压缩算法:使用RLE编码压缩相邻单元格的PVS数据,内存占用减少65%(实测1GB场景压缩至350MB)
      • 动态更新策略:对移动物体采用"潜在可见集增量更新",仅重新计算受影响单元格的15%采样点
    • 运作机制
      1. 编辑器阶段预计算‌(动态密度探针网格):使用Unity编辑器中的遮挡剔除窗口烘焙场景,生成基于网格单元的可见性数据。

        • 根据场景几何密度自动生成4x4x4探针组成的‌ 砖块(Brick) 结构,室内复杂区域采用高密度探针(间距1-3米),开放地形使用低密度探针(间距9-27米),实现内存与精度的自适应平衡
        • 每个像素渲染时采样周围‌8个最近探针‌,通过GPU加速的三线性插值消除传统光照探针的接缝问题
      2. 运行时动态评估(流式数据管理) ‌:根据摄像机位置实时加载预计算数据,仅渲染当前可见对象;动态物体通过包围盒测试更新遮挡关系。
        • PVS数据按逻辑分区存储在‌ 光照场景(Lighting Scenes) 中,配合Addressables系统实现运行时动态加载/卸载
        • Adaptive Probe Volumes (APV)技术支持‌分块更新‌,昼夜循环中仅刷新受阳光角度影响的探针组,单帧更新耗时低至3ms
      3. 混合渲染协同(混合精度烘焙) :与URP的单Pass前向渲染结合,在一个Draw Call中处理多个光源,减少渲染通道开销
        • 预计算阶段结合‌ 16K×16K虚拟阴影贴图(VSM) 深度数据,精确捕捉遮挡体轮廓
        • 采用‌多级LOD协同‌策略:远景物体用简化碰撞体参与计算,近景物体保留完整网格,烘焙效率提升8倍
    • 输出数据类型
      • 可见性位图‌:存储每个网格单元的可见性信息,格式为压缩位图(BitArray),运行时通过GPU快速解析。
      • 动态更新数据包‌:记录移动物体引起的遮挡变化,包含漫反射/镜面光照强度、方向性光照等参数,按三通道浮点纹理存储,通过异步管线传输至GPU。
      • 烘焙配置文件‌:存储编辑器生成的遮挡参数(如Smallest Hole),适配不同场景复杂度。运行时生成的局部更新数据(如移动物体遮挡关系变化),通过异步计算管线传输至GPU。
      graph LR
      A[场景几何分析] --> B[自动探针密度划分]
      B --> C[深度缓冲区烘焙]
      C --> D[可见性位图生成]
      D --> E[运行时流式加载]
      E --> F[每帧8探针采样]
      F --> G[三线性插值渲染]

二、Compute Shader实时计算体系(2021+)

  1. 硬件加速架构

    • 三级流水线设计

      [Depth Pyramid构建] → [HiZ缓冲生成] → [遮挡查询并行化]

      通过异步计算管线实现三阶段重叠执行,延迟降低至0.8ms
  2. 核心算法实现

    • 深度层次结构(HiZ)

      • 使用Mipmap链式结构存储深度图,每级分辨率减半
      • 通过InterlockedMin原子操作更新深度值,支持128线程并行写入
    • 动态遮挡判定
            // Compute Shader关键代码段
      [numthreads(8,8,1)]
      void OcclusionTest(uint3 id : SV_DispatchThreadID) {
      float4 bounds = _ObjectBounds[id.x];
      if(TestHiZOcclusion(bounds, _HiZBuffer)) {
      _VisibleIndexBuffer.Store(id.x, 0); // 标记为不可见
      }
      }

      单个DrawCall可处理2048个物体包围盒测试

  3. 混合精度模式

    • 移动端适配:采用FP16精度存储深度金字塔,性能提升2.3倍(对比FP32)
    • PC端优化:RTX显卡启用Tensor Core加速,HiZ生成速度达120FPS@4K

三、技术对比与演进

特性 传统BSP/PVS Compute Shader方案
更新频率 静态/每5秒 每帧(60Hz)
动态物体支持 不支持 完全支持
内存占用 场景体积的30% 显存的5%
典型延迟 15ms 1.2ms
适用场景 大型静态环境 开放世界+动态破坏

当前URP 2025版本已实现两种技术的自动切换:当动态物体占比>35%时启用Compute Shader模式,否则回退到优化后的PVS方案

  • 混合剔除‌:在AR/VR场景中结合深度传感器数据,通过多模态融合算法更新遮挡关系,精度达99%
  • 混合剔除策略通过分层处理优化性能:静态物体完全依赖预计算数据,动态物体每帧实时查询,远景物体则采用近似方法减少更新频率。整体上,URP的遮挡剔除以PVS为骨架,通过硬件加速提升适应性
  • PVS技术主导静态场景‌:

    静态物体必须预先烘焙遮挡数据,通过编辑器设置Occluder StaticOccludee Static标签,并利用Window > Rendering > Occlusion Culling窗口生成可见性信息。这种预计算方法将场景划分为网格单元(Cell),离线计算并存储可见性位图(BitArray),大幅降低运行时负载,尤其适用于墙体、地形等固定遮挡物。烘焙参数如Smallest Hole和Backface Threshold可调节精度与效率平衡。
  • 实时GPU加速支持动态场景‌:

    对于动态物体(如移动角色),Unity 2021后引入Compute Shader驱动的异步查询机制,通过分离遮挡计算与渲染流水线,实现实时深度缓冲区分析。这打破了传统PVS的限制,支持每帧更新遮挡关系,并结合Occlusion Area组件定义动态物体的参与范围。在混合架构中,动态物体采用包围盒或精确网格测试,避免预烘焙开销
  • GPU加速‌:通过异步计算管线分离遮挡查询与渲染流程,复杂场景效率提升300%

执行层级

  • C++核心‌:剔除计算主要在引擎底层实现,包括视锥体剔除和遮挡查询
  • URP定制‌:通过C#端配置Occlusion Culling属性和Occlusion Area组件,控制剔除精度(QualitySettings.occlusionCullingQuality)
  • 数据烘焙‌:需在编辑器预生成遮挡数据,通过Window > Rendering > Occlusion Culling窗口操作

优化要点

  • 材质限制‌:透明材质需标记为Occludee Static,建议使用不透明材质作为遮挡体
  • 移动端适配‌:动态调整剔除精度可降低15% GPU功耗,视觉差异小于2%
  • LOD协同‌:静态遮挡物使用LOD0轮廓进行剔除判断,需注意各级别轮廓一致性

未来演进

  • 神经渲染‌:实验性整合NeRF技术预测未观测区域遮挡关系,延迟降低80%
  • 硬件协同‌:RTX 40系列光追核心与Unity API深度整合,实现实时光追场景60fps+

【从UnityURP开始探索游戏渲染】专栏-直达

(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,)

本文由博客一文多发平台 OpenWrite 发布!

【渲染流水线】[应用阶段]-[遮挡剔除]以UnityURP为例的更多相关文章

  1. Unity Shader入门精要学习笔记 - 第2章 渲染流水线

    来源作者:candycat   http://blog.csdn.net/candycat1992/article/ 2.1 综述 渲染流水线的最终目的在于生成或者说是渲染一张二维纹理,即我们在电脑屏 ...

  2. Unity 渲染流水线 :CPU与GPU合作创造的艺术wfd

    前言 对于Unity渲染流程的理解可以帮助我们更好对Unity场景进行性能消耗的分析,进而更好的提升场景渲染的效率,最后提升游戏整体的性能表现 Unity的游戏画面的最终的呈现是由CPU与GPU相互配 ...

  3. Unity4.3 遮挡剔除:基本知识

    http://blogs.unity3d.com/2013/12/02/occlusion-culling-in-unity-4-3-the-basics/ 这篇博文由Umbra Software的J ...

  4. Shader 入门笔记(二) CPU和GPU之间的通信,渲染流水线

    渲染流水线 1)应用阶段(CPU处理) 首先,准备好场景数据(摄像机位置,视锥体,模型和光源等) 接着,做粗粒度剔除工作. 最后,设置好每个模型的渲染状态(使用的材质,纹理,shader等) 这一阶段 ...

  5. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第五章:渲染流水线

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第五章:渲染流水线 学习目标 了解几个用以表达真实场景的标志和2D图像 ...

  6. 《UnityShader入门精要》学习笔记之渲染流水线

    第一种分类方式: 图形管道(如下7步): 顶点数据 : 由3D模型传递的三角形网格 顶点着色 : 编写CG程序对各个顶点进行着色 生成几何图元 : 连接特定的顶点生成几何图元,例如连接三个顶点生成一个 ...

  7. Occlusion Culling遮挡剔除理解设置和地形优化应用

    这里使用的是unity5.5版本 具体解释网上都有,就不多说了,这里主要说明怎么使用,以及参数设置和实际注意点 在大场景地形的优化上,但也不是随便烘焙就能降低帧率的,必须结合实际情况来考虑,当然还有透 ...

  8. 遮挡剔除 Occlusion Culling(转)

    一.首先介绍下draw call(这个东西越少你的游戏跑的越快): 在游戏中每一个被展示的独立的部分都被放在了一个特别的包中,我们称之为“描绘指令”(draw call),然后这个包传递到3D部分在屏 ...

  9. Unity Shader 之 渲染流水线

    Unity Shader 之渲染流水线 什么是渲染流水线 一个渲染流程分成3个步骤: 应用阶段(Application stage) 几何阶段(Geometry stage) 光栅化阶段(Raster ...

  10. Unity Occlusion Culling 遮挡剔除研究

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/52684127 作者:car ...

随机推荐

  1. React-Native开发鸿蒙NEXT-一次审核闪退的排查思路

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  2. java 钉钉群机器人发消息通知工具类

    测测类 /** * 测试钉钉群通知 * * @return */ @GetMapping("/testDingTalk") public Result testDingTalk() ...

  3. NOIp2020复赛后的故事

    NOIp2020复赛后的故事 过渡 \(15\)号,学校开了一个竞赛生大会. 胡校长大致就是说了些鼓励我们的话,让我们放心大胆的去拼搏,别怕因为停课而落下了\(whk\). \(18\sim19\)号 ...

  4. NOIp2020复赛游记

    NOIp2020复赛游记 T1 他们用的都是拓扑排序,但是我用的是\(bfs\)+\(online\)标记\(\dots\dots\)样例当然能过,但是会被卡成暴力. 不过,他们有人用拓扑时,要么把入 ...

  5. 深入剖析开源AI阅读器项目Saga Reader基于大模型的文本转换与富文本渲染优化方案

    引言 AI阅读器作为一种新型的内容消费工具,正在改变人们获取和处理信息的方式.本文将介绍Saga Reader项目中如何利用大型语言模型(LLM)进行网页内容抓取.智能优化和富文本渲染,特别是如何通过 ...

  6. MYSQL安装和版本选择(centos9作为样例)

    下载 mysql下载地址:https://dev.mysql.com/downloads/mysql/ 系统版本选择 进入后如图,需要选择版本与系统版本 selectVersion:选择版本 mysq ...

  7. Win10环境安装Anaconda(3-2021.05)+Tensorflow(2.6)

    Win10环境安装Anaconda(3-2021.05)+Tensorflow(2.6) ​ 在学习机器学习的过程中会用到许多Python库,例如tensorflow.pandas等,用到的时候单独去 ...

  8. 堆栈与堆:临时变量std::vector<int> i; 在堆还是栈上?

    在学习C++ STL的过程中,会遇到很多动态分配内存的情况,以std::vector的实现(简化版)为例: template <typename T> class SimpleVector ...

  9. 六、Linux系统 DRM调试工具modetest

    4.20.modetest(调试 DRM) modetest 是 libdrm 提供的一个测试工具,用于调试 DRM(Direct Rendering Manager) 设备,它能够列出可用的显示设备 ...

  10. plugin:prettier/recommended和vue/max-attributes-per-line冲突

    具体表现为 eslint虽然配置如下 module.exports = { root: true, env: { 'vue/setup-compiler-macros': true, // 处理err ...