Unity中的渲染管线
Unity中的渲染管线负责将3D场景转换为2D图像,其核心流程和应用各有特点。下面我会为你梳理Unity中三种主流渲染管线的对比、渲染管线的核心工作流程,以及如何查看当前项目使用的渲染管线。
🎯 Unity三种主流渲染管线对比
Unity中的三种主流渲染管线各有其定位和特点,我用一个表格来帮你更直观地对比和选择:
特性维度 | 内置渲染管线 (Built-in) | 通用渲染管线 (URP) | 高清渲染管线 (HDRP) |
---|---|---|---|
发布年份/版本 | Unity早期版本 | 原LWRP,2019.3版本正式更名为URP 6 | 与URP同期推出 |
官方定位 | 稳定、通用 | 轻量、高性能、跨平台 10 | 高保真图形、PC/主机高端平台 10 |
适用平台 | 所有主流平台 | 移动设备、低端PC、VR/AR 10 | PC(Windows/Mac)、高性能主机(PS5/Xbox Series X)10 |
性能特点 | 稳定,但效率优化空间有限 | 高性能、低功耗、支持SRP Batcher 10 | 高硬件要求,追求极致画质而非性能 10 |
光源处理 | 前向渲染:每物体受最多4个逐顶点光源影响 7 | 优化多光源处理,假定主光源是平行光、限定附加光源数量,尝试在一个Pass内完成计算 10 | 基于物理的光照,支持大量动态光源和复杂光照效果 10 |
图形质量 | 基础 | 中等,支持一些基于物理的渲染特性 | 电影级、照片级真实感,支持高级体积光、区域光照、光线追踪等 10 |
Shader编写 | 支持Fixed Function、Surface、Vertex/Fragment Shader 1 | Shader Graph可视化编写 6,也支持传统CG/HLSL编写(需适配URP) | Shader Graph或复杂HLSL/CG,支持最新硬件特性 |
学习与使用成本 | 低 | 中 | 高 |
典型应用场景 | 2D游戏、简单3D、原型开发、对特定Unity版本有依赖的项目 | 手机游戏、独立游戏、VR/AR应用、需要跨平台且图形效果适中的项目 10 | 3A级游戏、建筑可视化、汽车渲染、高端模拟训练 10 |
💡 如何选择:
-
如果你的项目目标是移动平台或需要广泛的设备兼容性,URP通常是明智的选择10。
-
如果你的项目是针对PC或主机平台,并且追求极致的图形保真度,HDRP能提供强大的能力10。
-
内置渲染管线目前主要适用于维护旧项目或一些特殊需求10。
🔍 渲染管线的核心工作流程
Unity中的渲染管线负责将游戏场景中的3D对象转换为最终屏幕上显示的2D图像。这个过程可以被概念性地分为三个主要阶段,下图概括了这一流程:
图表
代码
-
应用阶段 (Application Stage) [由CPU负责]
应用阶段在CPU上进行,主要为渲染做准备2。其主要任务包括:-
准备场景数据:如摄像机位置、视锥体、模型和光源信息等2。
-
粗粒度剔除 (Culling):通常会将视锥体外的不可见物体剔除,避免不必要的渲染2。
-
设置渲染状态:指定每个模型使用的材质、纹理、Shader等,定义物体如何被绘制2。
-
输出渲染图元 (Render Primitive) 并提交DrawCall:将处理好的几何信息(如顶点位置、法线、UV等)传递给GPU。DrawCall是CPU请求GPU绘制一个图元(如三角形)的命令25。DrawCall过多是造成CPU性能瓶颈的常见原因,通常可通过合批 (Batching) 或使用 GPU Instancing 等技术来优化2。
-
-
几何阶段 (Geometry Stage) [由GPU负责]
几何阶段在GPU上进行,主要负责与几何相关的变换和计算2。其核心步骤包括:-
顶点着色器 (Vertex Shader):这是可编程渲染管线中可编程的部分。每个顶点都会执行一次顶点着色器,负责进行坐标变换(如模型矩阵、视图矩阵、投影矩阵,即MVP变换)和基础的光照计算(如逐顶点光照)45。
-
裁剪 (Clipping):将完全在视锥体外的图元丢弃,部分在外的进行裁剪2。
-
屏幕映射 (Screen Mapping):将坐标从裁剪空间转换到屏幕空间2。
此阶段最终输出屏幕空间的二维顶点坐标、深度值及着色等信息2。
-
-
光栅化阶段 (Rasterization Stage) [由GPU负责]
光栅化阶段决定几何阶段传来的图元最终覆盖了屏幕上的哪些像素,并为这些像素计算颜色2。-
三角形设置与遍历 (Triangle Setup & Traversal):确定哪些像素被三角形覆盖,并为这些像素生成片元 (Fragment)2。
-
片元着色器 (Fragment Shader) 或 像素着色器 (Pixel Shader):这是可编程渲染管线中另一个可编程的部分。每个片元都会执行一次片元着色器,其主要工作是进行纹理采样、复杂的逐像素光照计算(如法线贴图、高光反射)并输出最终的片元颜色4。
-
逐片元操作 (Per-Fragment Operations):片元着色器输出的颜色并不会直接成为屏幕像素。还需经过一系列测试与混合:
-
深度测试 (Depth Test):比较片元的深度值与深度缓冲区中当前的值,丢弃被遮挡的片元,解决 visibility 问题。
-
模板测试 (Stencil Test):根据模板缓冲区的值决定是否丢弃片元,用于实现特殊效果如遮罩、轮廓等。
-
混合 (Blending):将当前片元的颜色与帧缓冲区中已有的颜色根据Alpha值进行混合,用于渲染透明或半透明物体2。
通过所有测试的片元颜色最终会写入帧缓冲区 (Framebuffer),随后显示到屏幕上2。
-
-
🔎 查看当前使用的渲染管线
在Unity编辑器中,你可以通过以下步骤快速查看当前项目正在使用的渲染管线:
-
依次点击菜单栏的 Edit -> Project Settings,打开项目设置窗口。
-
在项目设置窗口的左侧列表中,选择 Graphics 选项卡。
-
在Graphics设置中,找到 Scriptable Render Pipeline Settings 字段。
-
如果该字段为 空(None),则表示你的项目当前使用的是内置渲染管线 (Built-in Render Pipeline)36。
-
如果该字段引用了 UniversalRP-Asset(或类似名称)的资产,则表示你正在使用通用渲染管线 (URP)。
-
如果该字段引用了 HDRP-Asset(或类似名称)的资产,则表示你正在使用高清渲染管线 (HDRP)。
-
你还可以通过检查项目中的Package Manager(窗口 -> Package Manager),查看已安装的包列表中来确认是否安装了URP或HDRP包。
情况一:从内置管线切换到 URP(最常见)
这是最常用的切换场景,适用于移动端、PC独立游戏或VR项目。
步骤 1:安装 URP 包
-
打开 Package Manager (菜单栏 -> Window -> Package Manager)。
-
在上方的下拉菜单中,将 Packages: 从 In Project 切换到 Unity Registry。
-
在列表中找到 Universal RP (你可以使用搜索框)。
-
选择它并点击右下角的 Install。
步骤 2:创建 URP 资源 (Asset)
-
在 Project 窗口右键点击。
-
选择 Create -> Rendering -> Universal Render Pipeline -> Pipeline Asset (和可选的 Renderer Asset)。
-
通常只需创建一个 Pipeline Asset(例如命名为
UniversalRP_Asset
),它会自动关联一个默认的 Renderer。
-
步骤 3:分配 URP 资源到图形设置
-
打开 Project Settings (Edit -> Project Settings)。
-
选择 Graphics 选项卡。
-
将你刚刚创建的 UniversalRP_Asset 拖拽到 Scriptable Render Pipeline Settings 字段中。
-
立即生效:当你完成这一步时,Unity编辑器会重新编译着色器并刷新场景。你会立刻注意到光照和阴影的变化,这表明你已成功切换到URP。
步骤 4(至关重要):转换现有材质
内置管线的标准着色器 (Standard Shader) 与URP不兼容。如果你的场景中使用了大量内置材质,它们会变成洋红色(Magenta),表示缺少正确的着色器。
-
在Project窗口中,找到你创建的 UniversalRP_Asset 并选中它。
-
在它的 Inspector 窗口中,找到 Advanced 部分。
-
点击 Upgrade Project Materials to UniversalRP Materials 按钮。
-
注意:强烈建议在执行此操作前对项目进行备份! 此操作会批量修改场景和项目中的材质,将其使用的着色器替换为URP兼容的着色器(如
Universal Render Pipeline/Lit
)。
-
情况二:从内置管线切换到 HDRP
适用于追求高端图形保真度的PC或主机项目。
步骤 1:安装 HDRP 包
-
在 Package Manager 中,从 Unity Registry 列表中找到并安装 High Definition RP 包。
步骤 2:创建 HDRP 资源并分配
-
在 Project 窗口右键点击,选择 Create -> Rendering -> High Definition Render Pipeline Asset -> HDRP Pipeline Asset。
-
打开 Graphics 设置,将创建的HDRP资源(例如
HDRP_Asset
)拖入 Scriptable Render Pipeline Settings 字段。
步骤 3:切换项目模式
HDRP要求项目使用线性颜色空间 (Linear Color Space)。
-
打开 Project Settings -> Player。
-
在 Other Settings 部分,找到 Rendering 下的 Color Space。
-
确保其设置为 Linear。(如果之前是Gamma,切换后需要重新光照烘焙)。
步骤 4:转换材质
-
同样,选中你的 HDRP_Asset。
-
在Inspector窗口中通常会提供升级项目材质的选项,例如 Fix All 按钮来批量修复材质。
情况三:在 URP 和 HDRP 之间相互切换
-
卸载当前SRP包:在 Package Manager 中,找到已安装的URP或HDRP包,点击 Remove。
-
安装目标SRP包:安装你想要的URP或HDRP包。
-
更换设置:在 Graphics 设置的
Scriptable Render Pipeline Settings
字段中,移除旧的资产,并拖入新创建的目标管线资产(URP或HDRP的Asset)。 -
转换和修复材质:使用新管线资产提供的工具升级材质。这可能比从内置管线切换更复杂,可能需要手动检查和重新设置一些材质。
⚠️ 重要注意事项
-
备份!备份!备份! 在切换渲染管线之前,务必对整个项目进行备份。这是一个重大的架构更改,操作不可逆,很容易破坏现有的材质和光照。
-
后期处理 (Post Processing):内置管线、URP和HDRP的后期处理效果实现方式完全不同。切换后,你需要删除旧的后期处理体积(Volume)并重新使用新管线的后期处理系统进行配置。
-
光照 (Lighting):切换后,所有基于光照贴图 (Baked Lightmap) 的光照都需要重新烘焙。
-
自定义着色器 (Custom Shaders):如果你或你使用的资源包中有为内置管线编写的自定义Shader,它们将无法工作,需要手动重写或找到对应管线版本的替代品。
-
测试:切换完成后,请务必在各个场景中进行全面测试,检查材质、光照、特效和UI显示是否正常。
总结来说,切换的核心步骤就是:安装包 -> 创建管线资产 -> 将资产拖入Graphics设置 -> 升级现有材质。只要谨慎操作并做好备份,这个过程会很顺利。