【URP】[Unity核心Buffer及其应用]

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

‌一、核心 Buffer 类型及用途‌

‌常量缓冲区(Constant Buffer)

‌功能‌

  • 存储渲染过程中不变的全局数据(如变换矩阵、光照参数、材质属性)。

实现类‌

  • 通过Shader.SetGlobal系列方法或MaterialPropertyBlock间接管理,底层由UnityEngine.Rendering.CommandBuffer控制

‌脚本位置‌

  • 数据注入通常在ScriptableRenderPass或MonoBehaviour脚本中完成(如Camera.main.SetGlobalMatrix)

‌应用位置‌

  • 用于避免每帧重复传输数据,提升 SRP 合批效率。

    c 复制代码
    hlsl
    CBUFFER_START(UnityPerMaterial)
    float4 _Color; // 材质属性
    float4x4 _WorldToCamera; // 视图矩阵
    CBUFFER_END

常量缓冲区更新‌

csharp 复制代码
csharp
// CPU注入数据(如每帧更新VP矩阵)
Shader.SetGlobalMatrix("_CameraViewProjection", camera.projectionMatrix * camera.worldToCameraMatrix);
  • GPU在着色器中通过CBUFFER_START(UnityPerCamera)读取

‌模板缓冲区(Stencil Buffer)

‌功能‌

  • 通过像素级掩码规则控制渲染区域(如轮廓光、UI 遮罩)。

实现类‌

  • UnityEngine.Rendering.Universal.RenderTargetHandle,通过CreateDepthTexture和ConfigureTarget配置

‌脚本位置‌

  • URP的ForwardRendererAsset配置文件中定义,运行时由ScriptableRenderer管理

‌应用逻辑‌:

  • 设置模板规则(如 Stencil{ Ref 1 Comp Equal } 仅渲染标记为 1 的区域)
  • 用于角色描边、镜子反射等特效。

模板缓冲区控制

c 复制代码
hlsl
Stencil {
    Ref 2
    Comp Equal
    Pass Keep
} // 仅渲染模板值为2的像素
  • 由URP的RenderObjects特性在Execute阶段触发写入

深度缓冲区(Depth Buffer)

‌功能‌

  • 存储像素深度值,管理物体前后遮挡关系(默认开启 ZWrite)。

‌优化场景‌

  • 半透明物体关闭 ZWrite 避免深度冲突,如粒子特效。

深度缓冲区复用

csharp 复制代码
csharp
// URP Renderer Feature中配置深度纹理
renderingData.cameraData.requiresDepthTexture = true;
  • 后处理通过_CameraDepthTexture采样深度值

‌帧缓冲区(Frame Buffer)

‌功能‌

  • 存储最终渲染输出,支持多渲染目标(MRT)用于后处理。

实现类‌

  • 逻辑概念,实际由RenderTexture和Camera.targetTexture组合实现

‌脚本位置‌

  • URP渲染管线核心逻辑位于UniversalRenderPipeline.cs

‌URP 配置‌:

csharp 复制代码
csharp
// URP Renderer Feature 中配置
ConfigureCameraTarget(BufferA, BufferB);// 双缓冲区实现运动模糊

‌二、关键应用场景‌

‌GraphicsBuffer‌

  • 动态地形裁剪时预加载包围盒顶点数据到显存,减少 CPU-GPU 传输。

‌常量缓冲区‌

  • SRP 合批中合并材质属性,降低 Draw Call(如静态场景批量渲染)。

‌模板缓冲区‌

  • 通过 RenderObjects 特性为特定层级(如"Outline")启用模板测试。

‌深度缓冲区‌

  • 在 Renderer Feature 中访问 _CameraDepthTexture 实现屏幕空间阴影。

‌三、性能优化原则‌

‌减少传输‌

  • 静态数据用 GraphicsBuffer 一次性上传,动态数据增量更新。

‌分层管理‌

  • 通过 Camera.cullingMask 剔除无关层级,结合距离裁剪降低负载。

‌缓冲区复用‌

  • 在 URP Renderer Feature 中共享 _CameraColorTexture 避免重复创建

常量缓冲区‌

  • 单帧内避免频繁更新,合并相关变量到同一CBUFFER

模板/深度‌

  • 通过Camera.main.depthTextureMode控制生成策略

帧缓冲区‌

  • 使用RenderTexture.GetTemporary动态分配避免内存泄漏

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

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

相关推荐
Jmyd01233 小时前
博物馆数字展厅系统架构设计:实景采集到云渲染全链路
unity·系统架构·博物馆·数字展厅·博物馆数字化
weixin_424294677 小时前
对于未加入 Script Execution Order 的脚本
unity
暴走约伯7 小时前
【VFX工具链源码拆解 03】告别机械劳动(下):材质字典映射批处理与智能纹理槽识别
unity·游戏引擎·材质
Wanda12147 小时前
机器人与机电一体化3D数字孪生机器-Day9
人工智能·3d·unity·机器人·数字孪生
暴走约伯8 小时前
【VFX工具链源码拆解 01】总体架构:大型项目特效流程的程序化落地
开发语言·经验分享·3d·unity·架构·游戏引擎
平行云1 天前
建筑BIM/3D可视化轻量级实时评审与分享方案
unity·ue5·3dsmax·实时云渲染·云桌面·云游戏·建筑bim
2501_915106322 天前
Windows 上开发 Unity iOS,使用 KXBuild 进行真机调试、性能采样与打包 ipa
windows·vscode·unity·ios·个人开发·swift·敏捷流程
FFFFujige2 天前
【Unity】一个的Dots用Ruhanka踩坑记录
unity·游戏引擎
凯基迪科技3 天前
Unity游戏加密锁逆向方案、选型与攻防分析
游戏·unity·游戏引擎
阿松爱学习3 天前
【Unity开发】局部区域截图功能实现
unity·c#