【URP】[Unity核心Buffer及其应用]
【从UnityURP开始探索游戏渲染】专栏-直达
一、核心 Buffer 类型及用途
常量缓冲区(Constant Buffer)
功能
- 存储渲染过程中不变的全局数据(如变换矩阵、光照参数、材质属性)。
实现类
- 通过
Shader.SetGlobal
系列方法或MaterialPropertyBlock
间接管理,底层由UnityEngine.Rendering.CommandBuffer
控制
脚本位置
- 数据注入通常在
ScriptableRenderPass
或MonoBehaviour
脚本中完成(如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
,通过CreateDepthTexture
和ConfigureTarget
配置
脚本位置
- 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)用于后处理。
实现类
- 逻辑概念,实际由
RenderTexture
和Camera.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及其应用]的更多相关文章
- Unity核心对象模型
总结的Unity引擎部分的核心对象模型类图,供大家学习时参考,根基类为Object,下一层包括核心基类GameObject,及其他作为资源的Mesh,Material,Shader,Texture,S ...
- Unity3D核心类介绍
脚本介绍与Unity核心类介绍 -------------------------------------------------------------------------------- 脚本介 ...
- 3人从小公寓创业,到世界最大引擎公司,Unity创始人谈14年...
Unity创始人David Helgason出席了5月11 - 13日在上海举办的Unite 2017 Shanghai,并在大会期间接受了游戏陀螺的专访,动情地讲述了这14年来从3人在公寓创业,到成 ...
- Unity组件
在学习C++的时候,对于面对对象有点了解.然后也使用过一段时间的Unity,用起来还是觉得,怎么这么好用.耦合性极低.当时不知道这是基于组件编程.所以现在来学习下基于组件的知识,并比较下基于组件和基于 ...
- 全球顶尖的内容创作引擎,Unity为创造而生
5月11日晚,Unite Beijing 2018 Keynote主题演讲于国家会议中心圆满落幕.今年的Keynote主题演讲汇聚了12位重量级嘉宾,为参会者呈现出了一场属于Unity 2018的技术 ...
- Java NIO 学习笔记(一)----概述,Channel/Buffer
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO 学习
Java NIO提供了与标准IO不同的IO工作方式: Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(B ...
- OpAmp Voltage Follower/Regulator
LDO Regulator High accuracy voltage regulator Vout = 2.5V * (1 + ( 5.6 / 6.8 ) ) = 4.55V Recently th ...
- PostFX v2后期处理特效包:升级更惊艳的视觉效果
https://mp.weixin.qq.com/s/BMkLLuagbhRSWspzeGhK7g Post-Processing Stack后期处理特效包能够轻松创建和调整高质量视觉效果,实现更为惊 ...
- Java IO模型:BIO、NIO、AIO
Java IO模型:BIO.NIO.AIO 本来是打算直接学习网络框架Netty的,但是先补充了一下自己对Java 几种IO模型的学习和理解.分别是 BIO.NIO.AIO三种IO模型. IO模型的基 ...
随机推荐
- oracleINS-13001 环境不满足最低要求
使用windows10等系统安装oracle 11g等版本的数据库时,经常会发现开始安装时弹出[INS-13001 环境不满足最低要求]的提示,此时可以点击[是]继续安装. 也可以点击[否]结束安装, ...
- 卓岚物联小程序通过4G串口服务器采集供热站流量计数据
1.概述 远程监控供热站流量计数据,可以随时随地查看流量计瞬时流量.累积流量,平均流量,运行时间等相关参数,可以远程修改流量计相关参数. 图一 4G串口服务器与流量计链接示意图 ZLAN8305作为4 ...
- 在浏览器中清除缓存和 Cookies
清除浏览器缓存和 Cookie 的说明 大多数浏览器中按 Ctrl+Shift+Delete 键打开菜单以清除缓存和 Cookie.如果此步骤不起作用,请在下面选择浏览器类型了解详细说明. Inter ...
- vuePress2.x 多页面 多目录生成方案
前言 因为官网介绍的都只有一个'一级标题' 只有一个markdown文件 最终编译后也只有一个html文件,类似于spa 单页项目 如何才有多页项目呢 百度查询 网上插件库有很多,大部分不能用, 后来 ...
- Django 实战:Celery 异步任务从环境搭建到调用全掌握
一.Celery入门 介绍 Celery 是一个简单.灵活且可靠的分布式任务队列系统,专注于实时处理的异步任务队列,同时也支持任务调度.Celery是实现异步任务.定时任务的一种工具. Celery ...
- leetcode 236 而哈数的最近公共祖先
简介 dfs 找出路劲,然后长链在短链里面找. code /** * Definition for a binary tree node. * struct TreeNode { * int val; ...
- ETL数据集成丨主流ETL工具(ETLCloud、DataX、Kettle)数据传输性能大PK
目前市面上的ETL工具众多,为了方便广大企业用户在选择ETL工具时有一个更直观性能方面的参考值,我们选取了目前市面上最流行的三款ETL工具(ETLCloud.DataX.Kettle)来作为本次性能传 ...
- FreeSwitch Hangup-Cause电话挂断原因速查
Freeswitch官网太慢了,经常还打不开,把电话挂断原因大全复制一份到这里,方便日常查看 ITU-T Q.850 Code SIP Equiv. Enumeration Cause Descrip ...
- 20212109 实验二《Python程序设计》实验报告
实验二 计算器设计 # 20212109 2021-2022-2 <Python程序设计>实验二报告课程:<Python程序设计>班级: 2121姓名: 施铖哲学号:20212 ...
- 正版Win11纯净版文件夹无响应卡死的问题
有一些使用win11正式版系统的小伙伴反馈说,他在打开文件夹速度都很慢,甚至还会出现无响应卡死的情况,那么遇到这种情况应该怎么办呢?下面雨林木风官网小编就来简单的说说解决方法吧.过程简单,操作方便!一 ...