【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模型的基 ...
随机推荐
- Potree 004 点云点大小形状设置
点云数据就是靠海量的点显示来模拟真实世界的.点大小设置就比较重要,例如如果数据稀疏,点显示的时候,可以设置稍微大一些.如果点数据比较密集,则可以显示小一些. 在Potree中,点云定义为PointCl ...
- Hugging Face 开源机器人 Reachy Mini 开启预定
Reachy Mini 是一款富有表现力的开源机器人,专为人机交互.创意编程和 AI 实验而设计.它价格亲民,体积小巧,却蕴藏着无限可能.无论年龄大小,全球的 AI 开发者都可以通过它共同编程.学习与 ...
- vue的keep-alive,后台播放音乐?
vue的keep-alive,是否能做到后台播放音视乐? 答案当然是不能. 因为处于失活状态的组件,其真实dom已经从页面移除了,只将其存放到了内存中. dom都不存在了,还播放啥. 能做什么? 顶多 ...
- 前端开发系列072-JQuery篇之框架Ajax模块
一.jQuery框架中的Ajax简介 Ajax技术的核心是XMLHTTPRequest对象,该对象是Ajax实现的关键,发送异步请求.接收服务器端的响应以及执行回调等操作都是通过XMLHTTPRequ ...
- 前端开发系列007-基础篇之JavaScript引用类型
本文将介绍JavaScript中值类型和引用类型,两种类型的区别以及编码时候的注意点. 一.值类型和引用类型介绍 在javaScript语言基础这篇文章中已经简单介绍了JavaScript中的数据类型 ...
- sublime user 配置
{ "font_size": 14, "tab_size": 4, "translate_tabs_to_spaces": true, &q ...
- 如何快速运用iPaas与协议进行接口对接
在数字化浪潮的推动下,企业对于数据整合和流程协同的需求日益迫切.然而,传统的数据集成方式往往面临着开发周期长.维护成本高.扩展性差等问题.这时,iPaas(Integration Platform a ...
- POLIR-Laws-民法典: 非常有用的: 第六章 民事法律行为 + 第三编 合同
民法典: 第六章 民事法律行为 + 第三编 合同 第六章 民事法律行为 第一节 一般规定 名事法律行为 是 民事主体 通过 意思表示 立更变止(CRUD: 设立.变更.终止) 民事法律关系的行为. A ...
- POLIR-Mind-Cognition-Neural Models-NLP(Neuro-Linguistic Programming) 思维逻辑层级(logical Levels)-理解+解决问题-无敌洞察力+高维思路-{精神,身份,价值,能力,行为,环境}
Neuro-Linguistic Programming-百知思维模型-NLP理解层次 能给你无敌洞察力+高维思路 https://v.douyin.com/iS74bMKr/ 最重要的两种能力: 目 ...
- CentOS 7安装MariaDB 10详解以及相关配置-九五小庞
第一步:添加 MariaDB yum 仓库 首先在CentOS操作系统中/etc/yum.repos.d/目录下添加 MariaDB 的YUM配置文件MariaDB.repo文件. vi /etc/y ...