【渲染管线】UnityURP中[渲染路径]选择
URP基于SRP,相比于Build-in的渲染管线,进一步开放了渲染流水线中各个Pass的配置与可编程性。除了内置的Forward前向渲染路径、Deferred延迟渲染路径、Forward+前向加渲染路径,这几种渲染路径中特定需要的渲染Pass以外,可以在渲染管线各个阶段插入自定义Pass来完成自定义操作。Build-in不具备修改管线中的各个阶段插入自定义Pass的能力。
【从UnityURP开始探索游戏渲染】专栏-直达
渲染的各个阶段的事件
这里列出渲染的各个阶段的事件枚举
RenderPassEvent(com.unity.render-pipelines.universal@14.0.12/Runtime/Passes/ScriptableRenderPass.cs),依此也可快速看出渲染的流程顺序:BeforeRendering(开始渲染前) → RenderingShadows(阴影渲染) →
RenderingPrePasses(预渲染) → RenderingGbuffer(G-buffer) →
RenderingDeferredLights(延迟着色) → RenderingOpaques(渲染不透明) →
RenderingSkybox(渲染天空盒) → RenderingTransparents(渲染透明) →
RenderingPostProcessing(后处理) → AfterRendering(渲染结束后)
| 枚举值 | 数值 | 描述 |
|---|---|---|
| BeforeRendering | 0 | 在渲染管线中其他所有通道之前执行ScriptableRenderPass。此时相机矩阵和立体渲染尚未设置。可用于绘制后期管线中使用的自定义输入纹理,如LUT纹理。 |
| BeforeRenderingShadows | 50 | 在渲染阴影贴图之前执行ScriptableRenderPass。此时相机矩阵和立体渲染尚未设置。 |
| AfterRenderingShadows | 100 | 在渲染阴影贴图之后执行ScriptableRenderPass。此时相机矩阵和立体渲染尚未设置。 |
| BeforeRenderingPrePasses | 150 | 在渲染预通道(如深度预通道)之前执行ScriptableRenderPass。此时相机矩阵和立体渲染已经设置完成。 |
| AfterRenderingPrePasses | 200 | 在渲染预通道(如深度预通道)之后执行ScriptableRenderPass。此时相机矩阵和立体渲染已经设置完成。 |
| BeforeRenderingGbuffer | 210 | 在渲染G-buffer通道之前执行ScriptableRenderPass。 |
| AfterRenderingGbuffer | 220 | 在渲染G-buffer通道之后执行ScriptableRenderPass。 |
| BeforeRenderingDeferredLights | 230 | 在渲染延迟着色通道之前执行ScriptableRenderPass。 |
| AfterRenderingDeferredLights | 240 | 在渲染延迟着色通道之后执行ScriptableRenderPass。 |
| BeforeRenderingOpaques | 250 | 在渲染不透明物体之前执行ScriptableRenderPass。 |
| AfterRenderingOpaques | 300 | 在渲染不透明物体之后执行ScriptableRenderPass。 |
| BeforeRenderingSkybox | 350 | 在渲染天空盒之前执行ScriptableRenderPass。 |
| AfterRenderingSkybox | 400 | 在渲染天空盒之后执行ScriptableRenderPass。 |
| BeforeRenderingTransparents | 450 | 在渲染透明物体之前执行ScriptableRenderPass。 |
| AfterRenderingTransparents | 500 | 在渲染透明物体之后执行ScriptableRenderPass。 |
| BeforeRenderingPostProcessing | 550 | 在渲染后处理效果之前执行ScriptableRenderPass。 |
| AfterRenderingPostProcessing | 600 | 在渲染后处理效果之后执行ScriptableRenderPass,但在最终blit、后处理AA效果和色彩分级之前。 |
| AfterRendering | 1000 | 在所有效果渲染完成后执行ScriptableRenderPass。 |
前向渲染
- 逐物体处理光照,适合移动端和简单光照场景。
延迟渲染
- 分离几何与光照计算,在屏幕空间执行光照,支持大量动态光源,但需更高显存开销 。配置方式:URP Asset 中设置渲染路径。
- 延迟渲染路径下GBufferPass阶段后,管线内部会固定处理LightingPass阶段,计算光照输出到缓冲区的
一、光照计算流程
输入数据来源
- 读取GBuffer纹理(RT0-RT3)中的材质属性(漫反射、法线、高光等)
- 深度缓冲区用于可见性判断和光源裁剪
计算方式
- 全屏四边形或光源几何体逐像素处理
- 定向光全局计算,点/聚光灯通过模板测试局部渲染
输出目标
- 直接写入帧缓冲区(Frame Buffer)形成最终颜色
二、关键实现文件
核心着色器
Internal-DeferredShading.shader:内置延迟光照计算逻辑- 包含光源类型分支(定向光、点光源、聚光灯)和阴影处理
HLSL工具库
UnityDeferredLibrary.hlsl:提供光照模型函数(如Blinn-Phong/PBR)UnityGBuffer.hlsl:定义GBuffer数据编码/解码方法
C#管线控制
DeferredLights.cs:管理GBuffer创建与光照Pass调度
三、技术特性
性能优化
- 通过光源体积剔除和模板测试减少无效计算
扩展性
- 可通过替换
Internal-DeferredShading.shader自定义光照模型 - 延迟渲染路径下,透明序列的物体使用LightMode为UniversalForward的pass来渲染半透明物体
- 在Unity URP延迟渲染路径下,设置
LightMode="UniversalForward"的Pass会被执行,但仅针对特定类型的物体。以下是具体规则:
一、延迟渲染路径下的前向Pass执行规则
半透明物体强制前向渲染
- 所有标记为
"Queue"="Transparent"的物体,即使管线使用延迟渲染路径,其LightMode="UniversalForward"的Pass仍会被执行 - 原因:延迟渲染无法处理透明度混合,需退回前向路径
不透明物体的例外
- 不透明物体(
"Queue"="Geometry")的UniversalForwardPass在延迟路径下不会执行 - 此类物体统一由GBuffer Pass(
LightMode="UniversalGBuffer")处理
二、技术实现原理
| 管线阶段 | 执行内容 | 相关Pass的LightMode |
|---|---|---|
| 不透明物体阶段 | 写入GBuffer(颜色、法线、材质属性等) | UniversalGBuffer |
| 光照计算阶段 | 基于GBuffer进行屏幕空间光照叠加 | 内置管线Pass(无LightMode标签) |
| 半透明物体阶段 | 按前向渲染方式逐物体计算光照,混合到帧缓冲区 | UniversalForward |
光照计算由URP内置着色器Internal-DeferredShading.shader完成,不依赖材质Shader中的Pass
三、验证与实践要点
Shader配置示例
- 半透明物体必须显式声明前向标签:
SubShader {
Tags { "Queue" = "Transparent" }
Pass {
Tags { "LightMode" = "UniversalForward" } // 延迟路径下仍会执行
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
...
}
}
调试方法
- 使用Frame Debugger工具可观察到:
- 不透明物体仅显示
Render Opaques和GBuffer相关条目 - 半透明物体显示
Render Transparents条目并执行UniversalForwardPass
- 不透明物体仅显示
四、底层机制说明
URP延迟路径本质上是混合渲染方案:
不透明物体 → 延迟渲染(GBuffer + 屏幕空间光照)
半透明/特殊效果物体 → 前向渲染(逐物体光照计算)这种设计兼顾了不透明物体的光照性能与特殊材质的灵活性
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,)
【渲染管线】UnityURP中[渲染路径]选择的更多相关文章
- Unity Lighting - Choosing a Rendering Path 选择渲染路径(三)
Choosing a Rendering Path 选择渲染路径 Unity supports a number of rendering techniques, or ‘paths’. An i ...
- Unity3D光照前置知识——Rendering Paths(渲染路径)及LightMode(光照模式)译解
简述 Unity supports different Rendering Paths. You should choose which one you use depending on your g ...
- 基于Webkit的浏览器关键渲染路径介绍
关键渲染路径概念 浏览器是如何将HTML.JS.CSS.image等资源渲染成可视化的页面的呢?本文简单介绍一下渲染过程中涉及到的关键步骤. 该过程分为四步:模型对象的构建.渲染树构建.布局.绘制. ...
- 渲染路径-u3d渲染路径比较
Unity支持不同的渲染路径.应具体取决于你的游戏内容和目标平台/硬件来选择使用哪一个.不同的渲染路径有不同的特点和性能特点,主要影响灯光和阴影. 项目所使用的渲染路径在Player S ...
- shader实例(八)渲染路径RenderingPath
Unity的摄像机上支持3种RenderingPath,分别是VertexLit,Forward和Dferred Lighting,而shader中的LightMode标签Vertex,Forward ...
- JAVA WEB项目中各种路径的获取
JAVA WEB项目中各种路径的获取 标签: java webpath文件路径 2014-02-14 15:04 1746人阅读 评论(0) 收藏 举报 分类: JAVA开发(41) 1.可以在s ...
- web开发中目录路径问题的解决
web开发当中,目录路径的书写是再常用不过了,一般情况下不会出什么问题,但是有些时候出现了问题却一直感到奇怪,所以这里记录一下,彻底解决web开发中路径的问题,开发分为前端和服务端,那么就从这两个方面 ...
- JAVA文件中获取路径及WEB应用程序获取路径方法
JAVA文件中获取路径及WEB应用程序获取路径方法 1. 基本概念的理解 `绝对路径`:你应用上的文件或目录在硬盘上真正的路径,如:URL.物理路径 例如: c:/xyz/test.txt代表了tes ...
- php中相对路径和绝对路径如何使用(详解)
目录 一.总结 一句话总结: 1.php中用用“/”表示根目录么? 2.什么符号表示当前目录(asp,jsp,php都一样)? 3.php中如何使用$_SERVER['DOCUMENT_ROOT']做 ...
- 前向渲染路径细节 Forward Rendering Path Details
正向渲染路径细节 Forward Rendering Path Details Forward Rendering path renders each object in one or more pa ...
随机推荐
- UI跳转WE DYNPRO带参数
同事今天在做一个需求,需要把UI上的业务角色,传递给挂在UI上的DYNPRO程序.然后我们就研究了一下,发现挺好玩的. 1,设置URL参数 2.定义URL的参数 3.找到链接对应的类,把参数传上 4. ...
- 巧用指标平台DataIndex,五步法轻松实现指标管理
开发部门在做指标加工的全流程中,是否经常出现如下问题: · 业务部门看指标数据的时候,看到两个名称相似的指标,不清楚两个指标的差异性,来咨询开发部门指标计算口径,开发部门配合业务部门翻找代码,找出指标 ...
- Solon Expression Language (SnEL):轻量高效的Java表达式引擎
一.SnEL 是什么? Solon Expression Language(简称SnEL)是 Solon 生态体系中的轻量级表达式引擎,专为Java开发者设计.它采用独特的"求值表达式&qu ...
- 基于CAP组件实现补偿事务与消息幂等性
1 补偿事务和幂等性 在微服务架构下,我们会采用异步通信来对各个微服务进行解耦,从而我们会用到消息中间件来传递各个消息. 补偿事务 某些情况下,消费者需要返回值以告诉发布者执行结果,以便于发布者实施一 ...
- docusaurus简单使用
前言 docusaurus是一款使用markdown编写手册文档的工具,同类竞品有vitePress (放弃不维护的vuepress吧) 目前来看,比后者多了10k个start. docusaurus ...
- linux 主题
linux 默认主题见多了之后总会觉得审美疲劳,换一个新鲜的吧 装载自 linux公社 讲的已经比较好了 如果你使用的是图形界面,你会发现Ubuntu默认的界面真是丑的一批,所以下面以Ubuntu 1 ...
- MFC 不是类或命名空间名称
简介 好恶心啊MFC,为什么自定义类要收#include "stdafx.h"的约束 这个一定要放在第一行. GUESS 可能是为了加速编译的速度.不过也太恶心了吧.加速编译应该是 ...
- API自动化测试平台,提高API测试效率
RestCloud API自动化测试平台可根据API输入输出参数自动生成和保存测试用例,自动对API的参数边界进行测试,根据测试结果输出测试报告可全面提升API的测试效率.API自动化测试平台同时支持 ...
- SciTech-BigDataAIML-CV+CG-Digital Image/Signal Processing-
Links: Lectures: https://mandeel.github.io/lectures.html https://mandeel.github.io/ A Ph.D. in compu ...
- Win11电脑设置系统还原点的问题
有雨林木风官网用户,问小编在原版win11系统里面怎么设置系统还原点?先来说说,在Windows11系统中的系统还原点功能,只要系统有什么问题,我们可以还原这个备份的还原点,就不用重新安装一些常用的软 ...