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")的UniversalForward Pass在延迟路径下‌不会执行
  • 此类物体统一由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 OpaquesGBuffer相关条目
    • 半透明物体显示Render Transparents条目并执行UniversalForward Pass

‌四、底层机制说明‌

  • URP延迟路径本质上是‌混合渲染方案‌:

  • 不透明物体 → ‌延迟渲染‌(GBuffer + 屏幕空间光照)

  • 半透明/特殊效果物体 → ‌前向渲染‌(逐物体光照计算)这种设计兼顾了不透明物体的光照性能与特殊材质的灵活性


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

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

【渲染管线】UnityURP中[渲染路径]选择‌的更多相关文章

  1. Unity Lighting - Choosing a Rendering Path 选择渲染路径(三)

      Choosing a Rendering Path 选择渲染路径 Unity supports a number of rendering techniques, or ‘paths’. An i ...

  2. Unity3D光照前置知识——Rendering Paths(渲染路径)及LightMode(光照模式)译解

    简述 Unity supports different Rendering Paths. You should choose which one you use depending on your g ...

  3. 基于Webkit的浏览器关键渲染路径介绍

    关键渲染路径概念 浏览器是如何将HTML.JS.CSS.image等资源渲染成可视化的页面的呢?本文简单介绍一下渲染过程中涉及到的关键步骤. 该过程分为四步:模型对象的构建.渲染树构建.布局.绘制. ...

  4. 渲染路径-u3d渲染路径比较

    Unity支持不同的渲染路径.应具体取决于你的游戏内容和目标平台/硬件来选择使用哪一个.不同的渲染路径有不同的特点和性能特点,主要影响灯光和阴影.        项目所使用的渲染路径在Player S ...

  5. shader实例(八)渲染路径RenderingPath

    Unity的摄像机上支持3种RenderingPath,分别是VertexLit,Forward和Dferred Lighting,而shader中的LightMode标签Vertex,Forward ...

  6. JAVA WEB项目中各种路径的获取

    JAVA WEB项目中各种路径的获取 标签: java webpath文件路径 2014-02-14 15:04 1746人阅读 评论(0) 收藏 举报  分类: JAVA开发(41)  1.可以在s ...

  7. web开发中目录路径问题的解决

    web开发当中,目录路径的书写是再常用不过了,一般情况下不会出什么问题,但是有些时候出现了问题却一直感到奇怪,所以这里记录一下,彻底解决web开发中路径的问题,开发分为前端和服务端,那么就从这两个方面 ...

  8. JAVA文件中获取路径及WEB应用程序获取路径方法

    JAVA文件中获取路径及WEB应用程序获取路径方法 1. 基本概念的理解 `绝对路径`:你应用上的文件或目录在硬盘上真正的路径,如:URL.物理路径 例如: c:/xyz/test.txt代表了tes ...

  9. php中相对路径和绝对路径如何使用(详解)

    目录 一.总结 一句话总结: 1.php中用用“/”表示根目录么? 2.什么符号表示当前目录(asp,jsp,php都一样)? 3.php中如何使用$_SERVER['DOCUMENT_ROOT']做 ...

  10. 前向渲染路径细节 Forward Rendering Path Details

    正向渲染路径细节 Forward Rendering Path Details Forward Rendering path renders each object in one or more pa ...

随机推荐

  1. UI跳转WE DYNPRO带参数

    同事今天在做一个需求,需要把UI上的业务角色,传递给挂在UI上的DYNPRO程序.然后我们就研究了一下,发现挺好玩的. 1,设置URL参数 2.定义URL的参数 3.找到链接对应的类,把参数传上 4. ...

  2. 巧用指标平台DataIndex,五步法轻松实现指标管理

    开发部门在做指标加工的全流程中,是否经常出现如下问题: · 业务部门看指标数据的时候,看到两个名称相似的指标,不清楚两个指标的差异性,来咨询开发部门指标计算口径,开发部门配合业务部门翻找代码,找出指标 ...

  3. Solon Expression Language (SnEL):轻量高效的Java表达式引擎

    一.SnEL 是什么? Solon Expression Language(简称SnEL)是 Solon 生态体系中的轻量级表达式引擎,专为Java开发者设计.它采用独特的"求值表达式&qu ...

  4. 基于CAP组件实现补偿事务与消息幂等性

    1 补偿事务和幂等性 在微服务架构下,我们会采用异步通信来对各个微服务进行解耦,从而我们会用到消息中间件来传递各个消息. 补偿事务 某些情况下,消费者需要返回值以告诉发布者执行结果,以便于发布者实施一 ...

  5. docusaurus简单使用

    前言 docusaurus是一款使用markdown编写手册文档的工具,同类竞品有vitePress (放弃不维护的vuepress吧) 目前来看,比后者多了10k个start. docusaurus ...

  6. linux 主题

    linux 默认主题见多了之后总会觉得审美疲劳,换一个新鲜的吧 装载自 linux公社 讲的已经比较好了 如果你使用的是图形界面,你会发现Ubuntu默认的界面真是丑的一批,所以下面以Ubuntu 1 ...

  7. MFC 不是类或命名空间名称

    简介 好恶心啊MFC,为什么自定义类要收#include "stdafx.h"的约束 这个一定要放在第一行. GUESS 可能是为了加速编译的速度.不过也太恶心了吧.加速编译应该是 ...

  8. API自动化测试平台,提高API测试效率

    RestCloud API自动化测试平台可根据API输入输出参数自动生成和保存测试用例,自动对API的参数边界进行测试,根据测试结果输出测试报告可全面提升API的测试效率.API自动化测试平台同时支持 ...

  9. 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 ...

  10. Win11电脑设置系统还原点的问题

    有雨林木风官网用户,问小编在原版win11系统里面怎么设置系统还原点?先来说说,在Windows11系统中的系统还原点功能,只要系统有什么问题,我们可以还原这个备份的还原点,就不用重新安装一些常用的软 ...