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

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

‌常量缓冲区(Constant Buffer)

功能

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

实现类

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

脚本位置

  • 数据注入通常在ScriptableRenderPassMonoBehaviour脚本中完成(如Camera.main.SetGlobalMatrix

应用位置

  • 用于避免每帧重复传输数据,提升 SRP 合批效率。
    hlsl
    CBUFFER_START(UnityPerMaterial)
    float4 _Color; // 材质属性
    float4x4 _WorldToCamera; // 视图矩阵
    CBUFFER_END

常量缓冲区更新

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

‌模板缓冲区(Stencil Buffer)

功能

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

实现类

  • UnityEngine.Rendering.Universal.RenderTargetHandle,通过CreateDepthTextureConfigureTarget配置

脚本位置

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

应用逻辑‌:

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

模板缓冲区控制

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

深度缓冲区(Depth Buffer)

功能

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

优化场景

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

深度缓冲区复用

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

‌帧缓冲区(Frame Buffer)

功能

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

实现类

  • 逻辑概念,实际由RenderTextureCamera.targetTexture组合实现

脚本位置

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

URP 配置‌:

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开始探索游戏渲染】专栏-直达

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

【URP】[Unity核心Buffer及其应用]的更多相关文章

  1. Unity核心对象模型

    总结的Unity引擎部分的核心对象模型类图,供大家学习时参考,根基类为Object,下一层包括核心基类GameObject,及其他作为资源的Mesh,Material,Shader,Texture,S ...

  2. Unity3D核心类介绍

    脚本介绍与Unity核心类介绍 -------------------------------------------------------------------------------- 脚本介 ...

  3. 3人从小公寓创业,到世界最大引擎公司,Unity创始人谈14年...

    Unity创始人David Helgason出席了5月11 - 13日在上海举办的Unite 2017 Shanghai,并在大会期间接受了游戏陀螺的专访,动情地讲述了这14年来从3人在公寓创业,到成 ...

  4. Unity组件

    在学习C++的时候,对于面对对象有点了解.然后也使用过一段时间的Unity,用起来还是觉得,怎么这么好用.耦合性极低.当时不知道这是基于组件编程.所以现在来学习下基于组件的知识,并比较下基于组件和基于 ...

  5. 全球顶尖的内容创作引擎,Unity为创造而生

    5月11日晚,Unite Beijing 2018 Keynote主题演讲于国家会议中心圆满落幕.今年的Keynote主题演讲汇聚了12位重量级嘉宾,为参会者呈现出了一场属于Unity 2018的技术 ...

  6. Java NIO 学习笔记(一)----概述,Channel/Buffer

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  7. Java NIO 学习

    Java NIO提供了与标准IO不同的IO工作方式: Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(B ...

  8. OpAmp Voltage Follower/Regulator

    LDO Regulator High accuracy voltage regulator Vout = 2.5V * (1 + ( 5.6 / 6.8 ) ) = 4.55V Recently th ...

  9. PostFX v2后期处理特效包:升级更惊艳的视觉效果

    https://mp.weixin.qq.com/s/BMkLLuagbhRSWspzeGhK7g Post-Processing Stack后期处理特效包能够轻松创建和调整高质量视觉效果,实现更为惊 ...

  10. Java IO模型:BIO、NIO、AIO

    Java IO模型:BIO.NIO.AIO 本来是打算直接学习网络框架Netty的,但是先补充了一下自己对Java 几种IO模型的学习和理解.分别是 BIO.NIO.AIO三种IO模型. IO模型的基 ...

随机推荐

  1. oracleINS-13001 环境不满足最低要求

    使用windows10等系统安装oracle 11g等版本的数据库时,经常会发现开始安装时弹出[INS-13001 环境不满足最低要求]的提示,此时可以点击[是]继续安装. 也可以点击[否]结束安装, ...

  2. 卓岚物联小程序通过4G串口服务器采集供热站流量计数据

    1.概述 远程监控供热站流量计数据,可以随时随地查看流量计瞬时流量.累积流量,平均流量,运行时间等相关参数,可以远程修改流量计相关参数. 图一 4G串口服务器与流量计链接示意图 ZLAN8305作为4 ...

  3. 在浏览器中清除缓存和 Cookies

    清除浏览器缓存和 Cookie 的说明 大多数浏览器中按 Ctrl+Shift+Delete 键打开菜单以清除缓存和 Cookie.如果此步骤不起作用,请在下面选择浏览器类型了解详细说明. Inter ...

  4. vuePress2.x 多页面 多目录生成方案

    前言 因为官网介绍的都只有一个'一级标题' 只有一个markdown文件 最终编译后也只有一个html文件,类似于spa 单页项目 如何才有多页项目呢 百度查询 网上插件库有很多,大部分不能用, 后来 ...

  5. Django 实战:Celery 异步任务从环境搭建到调用全掌握

    一.Celery入门 介绍 Celery 是一个简单.灵活且可靠的分布式任务队列系统,专注于实时处理的异步任务队列,同时也支持任务调度.Celery是实现异步任务.定时任务的一种工具. Celery ...

  6. leetcode 236 而哈数的最近公共祖先

    简介 dfs 找出路劲,然后长链在短链里面找. code /** * Definition for a binary tree node. * struct TreeNode { * int val; ...

  7. ETL数据集成丨主流ETL工具(ETLCloud、DataX、Kettle)数据传输性能大PK

    目前市面上的ETL工具众多,为了方便广大企业用户在选择ETL工具时有一个更直观性能方面的参考值,我们选取了目前市面上最流行的三款ETL工具(ETLCloud.DataX.Kettle)来作为本次性能传 ...

  8. FreeSwitch Hangup-Cause电话挂断原因速查

    Freeswitch官网太慢了,经常还打不开,把电话挂断原因大全复制一份到这里,方便日常查看 ITU-T Q.850 Code SIP Equiv. Enumeration Cause Descrip ...

  9. 20212109 实验二《Python程序设计》实验报告

    实验二 计算器设计 # 20212109 2021-2022-2 <Python程序设计>实验二报告课程:<Python程序设计>班级: 2121姓名: 施铖哲学号:20212 ...

  10. 正版Win11纯净版文件夹无响应卡死的问题

    有一些使用win11正式版系统的小伙伴反馈说,他在打开文件夹速度都很慢,甚至还会出现无响应卡死的情况,那么遇到这种情况应该怎么办呢?下面雨林木风官网小编就来简单的说说解决方法吧.过程简单,操作方便!一 ...