📖
SRP 概述与演进历程
🎯
什么是 Scriptable Render Pipeline?
SRP(Scriptable Render Pipeline,可编程渲染管线)是 Unity 2018 引入的革命性特性,它将渲染管线的控制权从引擎内部转移到了开发者手中。在此之前,渲染行为基本是固定的黑盒,而 SRP 允许通过 C# 代码自定义整个渲染流程。
SRP 的核心设计理念是**「数据驱动 + 职责分离」**:开发者可以完全控制渲染顺序、资源管理、后处理链等各个方面,而 Unity 官方提供的 URP 和 HDRP 则是基于 SRP 构建的预制方案。
Unity 2018.1
SRP 正式发布
引入 Scriptable Render Pipeline,开发者可以创建自定义渲染管线。
Unity 2019.3
URP 正式版发布
Universal Render Pipeline(通用渲染管线)脱离预览状态,成为稳定版。
Unity 2020.1
HDRP 走向成熟
High Definition Render Pipeline(高清渲染管线)优化性能,开始支持更多 AAA 特性。
Unity 2021.2+
SRP Batcher 全面优化
引入 GPU Resident Renderer、Batcher 增强,大幅提升渲染效率。

🏗️
内置渲染管线架构
🔧
Built-in Pipeline 的核心特点
内置渲染管线是 Unity 最传统、历史最悠久的渲染方案。它采用**固定管线(Fixed Function)**的架构设计,许多渲染行为被硬编码在引擎深处,难以深度定制。
✓
简单易用
开箱即用,无需额外配置
✓
兼容性极佳
支持所有旧版 Shader 和资源
✗
难以定制
渲染顺序和 Pass 逻辑不可修改
✗
SRP Batcher
不支持,Draw Call 优化有限

cs
// Built-in Pipeline 传统 Surface Shader 写法
Shader "Custom/SimpleSurface" {
Properties {
_MainTint ("Color", Color) = (1,1,1,1)
}
SubShader {
Tags { "RenderType"="Opaque" }
CGPROGRAM
// 使用 Surface 函数自动处理光照
#pragma surface surf Lambert
float4 _MainTint;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = _MainTint.rgb;
}
ENDCG
}
}
⚠️
重要提示
Built-in Pipeline 将在 Unity 2024 后逐步进入维护模式,不推荐用于新项目开发。
🚀
URP 通用渲染管线
💡
URP 的设计理念
**Universal Render Pipeline(通用渲染管线)**是 Unity 为现代项目打造的「一站式」渲染解决方案。它在 SRP 基础上进行了深度优化,平衡了性能与画质,适用于从手游到 PC 的广泛场景。
URP 的核心哲学是**「可配置性与性能的平衡」**:提供了开箱即用的优质效果,同时允许通过 Render Feature、Render Pass 扩展功能。
✓
SRP Batcher 支持
大幅减少 Draw Call,支持 GPU Instancing
✓
Shader Graph 集成
可视化 Shader 开发,所见即所得
✓
可扩展渲染
通过 Scriptable Render Features 自定义 Pass
~
高端特性有限
不支持全局光照、_path tracing 等高级特性

cs
// 自定义 URP Render Feature
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
public class CustomRenderFeature : ScriptableRendererFeature {
public CustomRenderPass m_Settings;
public override void Create() {
m_Settings = new CustomRenderPass();
}
public override void AddRenderPasses(
ScriptableRenderer renderer,
RenderingData& renderingData)
{
renderer.EnqueuePass(m_Settings);
}
}
💡
适用场景
URP 是大多数项目的最佳选择:手游、独立游戏、VR 项目、以及需要高性能的中等规模项目。
🏔️
HDRP 高清渲染管线
🎬
HDRP 的定位与特性
**High Definition Render Pipeline(高清渲染管线)**是 Unity 面向 AAA 级项目的旗舰渲染方案。它追求最高画质,支持光线追踪、全局照明等电影级特效。
HDRP 的设计目标是**「照片级真实感」**,但代价是更高的硬件要求和资源消耗。
✓
光线追踪
Ray Tracing 全局光照、反射、阴影
✓
体积渲染
体积雾、云层、体积光
✓
物理材质
SSS、ClearCoat、分层材质
✗
性能开销大
需要高端 GPU,不适合移动设备
HDRP 与 URP 功能对比
| 特性 | HDRP | URP |
|---|---|---|
| 光线追踪 | 完整支持 | 有限支持 |
| 全局光照 | 实时 + 烘焙 | Baked only |
| 体积雾 | 完整 | 简化版 |
| 透明渲染 | Sort-aware | 基础 |
| 目标平台 | PC/Console | 全平台 |
📊
核心差异对比
| 维度 | Built-in | URP | HDRP |
|---|---|---|---|
| 渲染架构 | 固定管线 | SRP (Forward) | SRP (Deferred) |
| Shader 语言 | Surface/Fragment | Shader Graph / HLSL | Shader Graph / HLSL |
| SRP Batcher | ❌ 不支持 | ✅ 支持 | ✅ 支持 |
| GPU Instancing | 需手动设置 | 自动优化 | 自动优化 |
| 光照模型 | Phong/Blinn-Phong | Simple Lit / Lit | Physical Based |
| 后处理 | Post-process Stack v2 | Volume Framework | Volume Framework |
| 平台支持 | 全平台 | 全平台 (优化) | PC/Console |
| 学习曲线 | 低 | 中 | 高 |
如何选择渲染管线?

📝
Shader 编写范式变化
🔄
从 Surface Shader 到 Shader Graph
SRP 带来的最大变化之一是 Shader 编写方式的革新。在内置管线中,我们使用 Surface Shader 自动处理光照;而在 URP/HDRP 中,推荐使用Shader Graph 或手动 HLSL 编写。
cs
// URP Lit Shader 示例 - 使用 Shader Framework
Shader "Custom/URPCustomShader" {
Properties {
[Header(Basic)]
_BaseColor("Color", Color) = (1,1,1,1)
_BaseMap("Texture", 2D) = "white" {}
[Header(Advanced)]
[Toggle(_EMISSION)] _EmissionEnable("Emission", Float) = 0
_EmissionColor("Emission Color", Color) = (0,0,0,1)
}
SubShader {
Tags {
"RenderType"="Opaque"
"RenderPipeline"="UniversalPipeline"
}
Pass {
Name "ForwardLit"
Tags { "LightMode"="UniversalForward" }
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile _ _EMISSION
// URP Core Library
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
TEXTURE2D(_BaseMap);
SAMPLER(sampler_BaseMap);
struct Attributes {
float4 positionOS : POSITION;
float2 uv : TEXCOORD0;
float3 normalOS : NORMAL;
};
struct Varyings {
float4 positionCS : SV_POSITION;
float2 uv : TEXCOORD0;
float3 normalWS : TEXCOORD1;
};
CBUFFER_START(UnityPerMaterial)
float4 _BaseColor;
float4 _EmissionColor;
CBUFFER_END
Varyings vert(Attributes IN) {
Varyings OUT;
OUT.positionCS = TransformObjectToHClip(IN.positionOS.xyz);
OUT.uv = IN.uv;
OUT.normalWS = TransformObjectToWorldNormal(IN.normalOS);
return OUT;
}
half4 frag(Varyings IN) : SV_Target {
half4 baseColor = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv) * _BaseColor;
// 简单光照计算
Light mainLight = GetMainLight();
half NdotL = saturate(dot(IN.normalWS, mainLight.direction));
half3 diffuse = baseColor.rgb * NdotL * mainLight.color;
// Emission
half3 emission = half3(0,0,0);
#if defined(_EMISSION)
emission = _EmissionColor.rgb;
#endif
return half4(diffuse + emission, baseColor.a);
}
ENDHLSL
}
}
}
📦
核心区别
SRP Shader 使用 #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/*.hlsl" 引入 Unity 提供的标准库,而非传统的 UnityCG.cginc。
🛠️
迁移策略与最佳实践
📋
从 Built-in 迁移到 URP 的步骤
- 安装 URP 包 --- 通过 Package Manager 安装 Universal RP
- 创建 URP Asset --- 在 Project Settings > Graphics 中配置
- 升级 Materials --- 使用「Upgrade」工具批量转换材质
- 重写 Shaders --- Surface Shader → Shader Graph 或 HLSL
- 迁移后处理 --- 从 Post-process Stack 迁移到 Volume
- 性能测试 --- 验证 Draw Call 和帧率表现
迁移检查清单
📦
Resources 文件
检查 .mat/.shader 文件格式
🎨
Shader 兼容性
自定义光照模型可能需重写
⚡
光照设置
Light Explorer 配置差异
🔊
音频/粒子
某些粒子系统效果差异
✅
最佳实践建议
新项目直接使用 URP;旧项目迁移时先在测试场景验证核心 Shader 兼容性。充分利用 Unity 提供的「Render Pipeline Converter」工具。
🎯 总结
SRP 是 Unity 渲染架构的重大革新。内置管线适合简单项目和旧项目维护,URP 是大多数现代项目的最佳选择,而 HDRP 则面向追求极致画质的 AAA 项目。
URP → 推荐 90% 项目
HDRP → AAA/主机
Built-in → 维护模式