时间:2025-08-29 09:40
人气:
作者:admin
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。 |
Internal-DeferredShading.shader:内置延迟光照计算逻辑UnityDeferredLibrary.hlsl:提供光照模型函数(如Blinn-Phong/PBR)UnityGBuffer.hlsl:定义GBuffer数据编码/解码方法DeferredLights.cs:管理GBuffer创建与光照Pass调度Internal-DeferredShading.shader自定义光照模型LightMode="UniversalForward"的Pass会被执行,但仅针对特定类型的物体。以下是具体规则:"Queue"="Transparent"的物体,即使管线使用延迟渲染路径,其LightMode="UniversalForward"的Pass仍会被执行"Queue"="Geometry")的UniversalForward Pass在延迟路径下不会执行LightMode="UniversalGBuffer")处理| 管线阶段 | 执行内容 | 相关Pass的LightMode |
|---|---|---|
| 不透明物体阶段 | 写入GBuffer(颜色、法线、材质属性等) | UniversalGBuffer |
| 光照计算阶段 | 基于GBuffer进行屏幕空间光照叠加 | 内置管线Pass(无LightMode标签) |
| 半透明物体阶段 | 按前向渲染方式逐物体计算光照,混合到帧缓冲区 | UniversalForward |
光照计算由URP内置着色器
Internal-DeferredShading.shader完成,不依赖材质Shader中的Pass
SubShader {
Tags { "Queue" = "Transparent" }
Pass {
Tags { "LightMode" = "UniversalForward" } // 延迟路径下仍会执行
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
...
}
}
Render Opaques和GBuffer相关条目Render Transparents条目并执行UniversalForward PassURP延迟路径本质上是混合渲染方案:
不透明物体 → 延迟渲染(GBuffer + 屏幕空间光照)
半透明/特殊效果物体 → 前向渲染(逐物体光照计算)这种设计兼顾了不透明物体的光照性能与特殊材质的灵活性
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,????)