【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 配置文件

  1. Assets > Create > Rendering > URP Asset (with Universal Renderer)
  2. 配置关键设置:
  • Rendering Path:Forward(性能优先)或 Forward+(现代硬件)
  • Depth Texture/ Opaque Texture:启用(支持后处理和阴影)
  • MSAA:2x 或 4x(抗锯齿)
  • Quality:High/Medium/Low(根据目标平台)
  1. 创建 Forward Renderer Data
  • URP Asset > Renderer List > Add Renderer > Forward Renderer
  • 启用 Depth/Shadow/Decal 等功能

3. 项目设置转换

  1. Edit > Project Settings > Graphics
  • Scriptable Render Pipeline Settings:分配刚才创建的 URP Asset
  • Color Space:Linear(推荐真实光照)
  1. 自动材质转换
  • Edit > Rendering > Materials > Convert All Built-in Materials to URP/Lit
  • 或选择性转换:选中材质 > Inspector > 右上角 URP 转换按钮
  1. Shader 兼容性检查
  • 内置 Shader 自动替换为 URP/Lit、Simple Lit 或 Unlit
  • 自定义 Shader 需要手动转换为 HLSL 或使用 Shader Graph 重建

4. 场景设置

  1. 主相机
  • Rendering > Renderer:选择 URP Renderer
  • Output > Camera:确保 Render Type 为 Base 或 Overlay
  1. 光照设置
  • Window > Rendering > Lighting:烘焙 Lightmap(URP 支持)
  • 主光源:Directional Light 类型保持不变
  1. 后处理
  • 内置 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

  1. Assets > Create > Shader Graph > PBR Graph
  2. 双击打开 Shader Graph 编辑器
  • Master Node:输出节点,连接最终颜色
  • Properties:暴露参数到 Material Inspector
  • 节点库:搜索 Input、UV、Texture、Math 等
  1. 基本节点示例
   // 视觉化节点连接(伪代码表示)
   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 等价说明
StandardLit (PBR Graph)物理基渲染,完全兼容
Unlit/ColorUnlit (Unlit Graph)简单颜色,无光照
TransparentLit + TransparentBlend Mode 设置
Particle StandardLit/Complex + Particle特殊渲染队列
UI/DefaultUI/UnlitCanvas 专用

自定义 Shader 转换

  1. Shader Graph 重建
  • 导入旧 Shader 代码 → 手动重建节点图
  • 使用 Shader Graph Importer 工具(社区插件)
  1. 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 优化

  1. LOD 与 Cull
  • LOD Group 组件控制模型细节
  • Shader Graph 中设置 Cull Mode(Back/Front/Off)
  1. 纹理压缩
  • Texture Importer:ASTC(移动)、BC7(PC)
  • Shader Graph:使用 Sample Texture 2D LOD 节点控制采样
  1. 调试工具
  • 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 效果实现或性能调优案例,请提供更多细节!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注