【Unity】内置渲染管线升级URP,使用ShaderGraph
引言
将 Unity 内置渲染管线(Built-in Render Pipeline)升级到通用渲染管线(Universal Render Pipeline, URP)是现代 Unity 项目优化的重要步骤。URP 提供了更好的性能、可扩展性和跨平台兼容性,特别是移动端和低端硬件。Shader Graph 是 URP 的可视化着色器编辑器,让非专业程序员也能创建复杂着色器效果,无需编写 HLSL 代码。
升级过程涉及项目设置转换、材质重定向和 Shader Graph 学习曲线。本文将详细讲解从内置管线到 URP 的完整迁移流程,以及 Shader Graph 的核心使用方法。URP 支持 Unity 2019.4+,推荐 Unity 2022.3 LTS 或 Unity 6。
升级步骤详解
1. 安装 URP 包
// 通过 Package Manager 安装
Window > Package Manager > Unity Registry > 搜索 "Universal RP"
安装最新版本(推荐 14.x 或 16.x for Unity 2022+)
2. 创建 URP 配置文件
- Assets > Create > Rendering > URP Asset (with Universal Renderer)
- 配置关键设置:
- Rendering Path:Forward(性能优先)或 Forward+(现代硬件)
- Depth Texture/ Opaque Texture:启用(支持后处理和阴影)
- MSAA:2x 或 4x(抗锯齿)
- Quality:High/Medium/Low(根据目标平台)
- 创建 Forward Renderer Data:
- URP Asset > Renderer List > Add Renderer > Forward Renderer
- 启用 Depth/Shadow/Decal 等功能
3. 项目设置转换
- Edit > Project Settings > Graphics:
- Scriptable Render Pipeline Settings:分配刚才创建的 URP Asset
- Color Space:Linear(推荐真实光照)
- 自动材质转换:
- Edit > Rendering > Materials > Convert All Built-in Materials to URP/Lit
- 或选择性转换:选中材质 > Inspector > 右上角 URP 转换按钮
- Shader 兼容性检查:
- 内置 Shader 自动替换为 URP/Lit、Simple Lit 或 Unlit
- 自定义 Shader 需要手动转换为 HLSL 或使用 Shader Graph 重建
4. 场景设置
- 主相机:
- Rendering > Renderer:选择 URP Renderer
- Output > Camera:确保 Render Type 为 Base 或 Overlay
- 光照设置:
- Window > Rendering > Lighting:烘焙 Lightmap(URP 支持)
- 主光源:Directional Light 类型保持不变
- 后处理:
- 内置 Post-Processing Stack v2 → URP Volume
- GameObject > Volume > Global Volume 添加效果
Shader Graph 核心概念与使用
Shader Graph 基础
Shader Graph 通过节点连接创建着色器,支持以下类型:
- PBR Graph:物理基渲染(Lit),包含漫反射、镜面反射、高光
- Unlit Graph:无光照计算,适用于 UI、粒子、特效
- Sub Graph:可重用节点组,类似函数封装
- Target:Surface Type(Opaque/Transparent)、Blend Mode、Cull Mode
创建第一个 Shader Graph
- Assets > Create > Shader Graph > PBR Graph
- 双击打开 Shader Graph 编辑器:
- Master Node:输出节点,连接最终颜色
- Properties:暴露参数到 Material Inspector
- 节点库:搜索 Input、UV、Texture、Math 等
- 基本节点示例:
// 视觉化节点连接(伪代码表示)
Base Color ───┬── Texture2D (Albedo) ───┤
│ │
├── Color (Tint) ────────┼─── Master Node: Base Color
│ │
└── Time * Speed ─── Sin ─┘
Metallic ─── Constant (0.8) ─── Master Node: Metallic
Smoothness ─ Constant (0.9) ─── Master Node: Smoothness
实用 Shader Graph 示例
1. 波浪动画材质(Unlit Graph)
// 节点连接说明
UV ─── Tiling & Offset ─── Sine Time ─── Multiply ─── Base Color
│
└── Noise Texture ─── Add ─────── Alpha
C# 动态控制:
public class WaveMaterial : MonoBehaviour
{
public Material waveMaterial;
private float timeOffset;
void Update()
{
timeOffset += Time.deltaTime;
waveMaterial.SetFloat("_TimeOffset", timeOffset);
waveMaterial.SetVector("_WaveDirection", new Vector4(Mathf.Sin(timeOffset), Mathf.Cos(timeOffset), 0, 0));
}
}
2. 溶解效果(PBR Graph)
核心节点:
- Dissolve Texture:噪声图控制溶解边界
- Dissolve Amount:0-1 参数控制进度
- Edge Color:溶解边缘发光色
- Alpha Clip:基于阈值裁剪像素
// Shader Graph 参数暴露
[Header("Dissolve")]
public float _DissolveAmount = 0.5f;
public Texture2D _DissolveMap;
public Color _EdgeColor = Color.white;
public float _EdgeWidth = 0.1f;
3. 自定义光照(Lit Graph 扩展)
使用 Custom Function Node 嵌入 HLSL:
// Custom Function 代码
void CustomLighting_float(float3 WorldPos, float3 Normal, float3 LightDir, out float3 CustomColor)
{
float NdotL = max(0, dot(Normal, LightDir));
CustomColor = pow(NdotL, 2) * _RampTexture.Sample(sampler_RampTexture, NdotL);
}
材质系统迁移
材质类型对应表
内置管线材质 | URP Shader Graph 等价 | 说明 |
---|---|---|
Standard | Lit (PBR Graph) | 物理基渲染,完全兼容 |
Unlit/Color | Unlit (Unlit Graph) | 简单颜色,无光照 |
Transparent | Lit + Transparent | Blend Mode 设置 |
Particle Standard | Lit/Complex + Particle | 特殊渲染队列 |
UI/Default | UI/Unlit | Canvas 专用 |
自定义 Shader 转换
- Shader Graph 重建:
- 导入旧 Shader 代码 → 手动重建节点图
- 使用 Shader Graph Importer 工具(社区插件)
- HLSL 迁移:
// 内置管线 → URP HLSL
// 旧:fixed4 col = tex2D(_MainTex, uv);
// 新:
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
TEXTURE2D(_MainTex); SAMPLER(sampler_MainTex);
float4 col = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv);
性能优化与调试
URP 性能配置
// URP Asset 优化设置
Quality Settings:
- Main Light Shadows: Soft Shadows (性能代价高)
- Additional Lights: Per Vertex (移动端推荐)
- Reflection Probes: Static Only
- Screen Space Ambient Occlusion: 禁用(高开销)
Shader Graph 优化
- LOD 与 Cull:
- LOD Group 组件控制模型细节
- Shader Graph 中设置 Cull Mode(Back/Front/Off)
- 纹理压缩:
- Texture Importer:ASTC(移动)、BC7(PC)
- Shader Graph:使用 Sample Texture 2D LOD 节点控制采样
- 调试工具:
- Frame Debugger:检查 Draw Call 和 Shader 变体
- RenderDoc:GPU 着色器分析
- Shader Graph Preview:实时预览材质效果
常见问题解决
问题 | 解决方案 |
---|---|
材质变黑 | 检查 URP Asset 分配,光照烘焙 |
Shader Graph 不显示 | Target 设置错误,检查 Surface Type |
性能下降 | 减少 Additional Lights,优化 Shader 变体 |
Shadow 丢失 | 启用 Shadow Cascades,检查 Light Layer |
高级功能与扩展
自定义 Render Feature
// 自定义 URP Render Pass
public class CustomRenderFeature : ScriptableRendererFeature
{
class CustomRenderPass : ScriptableRenderPass
{
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
// 自定义渲染逻辑
CommandBuffer cmd = CommandBufferPool.Get("CustomPass");
// ... 渲染代码
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
}
}
CustomRenderPass m_ScriptablePass;
public override void Create()
{
m_ScriptablePass = new CustomRenderPass();
m_ScriptablePass.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
}
}
Shader Graph 与 VFX Graph 集成
- Material Override:VFX Graph 输出到 Shader Graph 材质
- Texture Sharing:动态纹理在特效和表面间共享
- GPU 事件:同步特效发射与表面动画
资源与学习路径
- 官方文档:https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@latest/
- Shader Graph 教程:Unity Learn “Shader Graph Fundamentals”
- URP 示例项目:GitHub Unity-Technologies/UniversalRenderingExamples
- 中文社区:Unity China 论坛、Bilibili “URP Shader Graph 教程”
- 性能分析:Unity Profiler + URP Dashboard
升级完成后,项目将获得:
- 性能提升:30-50% GPU 优化(移动端明显)
- 现代化工作流:Shader Graph + Volume Framework
- 未来兼容:HDRP 迁移基础,Unity 6 Render Graph 支持
如需特定 Shader Graph 效果实现或性能调优案例,请提供更多细节!