Unity 渲染路径理解
这篇笔记简单整理了 Unity 内置的几种渲染路径, 重点放在 前向渲染(Forward Rendering) 和 延迟渲染(Deferred Rendering) 上, 便于在写 Shader / 配置 Project Settings 时有一个整体的认知。
大多数项目通常只会选择一种主要渲染路径, 然后在个别相机上用不同的设置做补充。
一、前向渲染(Forward Rendering)
1. 基本说明
在前向渲染下,每次渲染一个物体时,都会:
- 绘制这个物体的几何图元;
- 同时更新 颜色缓冲 和 深度缓冲 两个缓冲区。
流程可以概括为:
- 深度缓冲判断某个片元是否可见;
- 如果可见,就用当前光照结果更新颜色缓冲;
- 对每个「逐像素光源」重复这套操作。
逐像素光源会在 Fragment 阶段计算,逐顶点光源则在 Vertex 阶段处理。
在 Unity 中:
- 「平行光」以及被标记为 Important 的光源一般按逐像素方式处理;
- 标记为 Not Important 的光源,会按逐顶点或 SH 的方式处理;
- 如果当前逐像素光源数量低于 Quality Settings 中的上限, Unity 可能会把更多光源提升为逐像素。
2. LightMode 标签与 Pass 结构
在 Shader 的 Pass 里通过 LightMode 标签指定当前 Pass 属于哪一类:
Tags { "LightMode" = "ForwardBase" }
前向渲染通常会包含两类 Pass:
-
Base Pass(ForwardBase)
- 负责:
- 一个逐像素平行光;
- 所有逐顶点光源和 SH 环境光;
- 一般还会在这里处理:
- 光照贴图(Lightmap);
- 环境光;
- 自发光;
- 阴影(通常是平行光阴影)。
- 负责:
-
Additional Pass(ForwardAdd)
- 负责其他影响该物体的逐像素光源;
- 一个逐像素光源对应一个 Pass;
- 默认情况下不包含阴影,如需阴影可使用:
#pragma multi_compile_fwadd_fullshadows,让 Unity 为这些 Pass 生成带阴影的变体。
在 Additional Pass 中会开启混合模式,把本次光照与之前的结果叠加:
Blend One One
这样多盏灯的贡献会被累加在 framebuffer 上。
3. 前向渲染的优缺点
优点:
- 实现相对直观,兼容大多数平台;
- 支持真正的多种透明效果;
- 对硬件要求相对较低。
缺点:
- 如果场景中有 N 个物体、M 个逐像素光源,
理论上可能需要近似
N × M个 Pass(每个光源都要单独处理); - 在光源数量较多时成本会明显上升。
二、延迟渲染(Deferred Rendering)
1. 基本原理
延迟渲染会使用一组额外的缓冲区,统称为 G-buffer(Geometry Buffer)。
整体分为两个主要 Pass:
-
几何 Pass(G-buffer Pass)
- 把可见片元的一些属性写入 G-buffer:
- 漫反射颜色;
- 高光颜色与平滑度;
- 法线信息;
- 自发光;
- 深度等;
- 此阶段不做光照计算。
- 把可见片元的一些属性写入 G-buffer:
-
光照 Pass(Lighting Pass)
- 基于 G-buffer 中的这些属性,按屏幕空间像素逐点计算光照;
- 结果再写入帧缓冲,得到最终图像。
在 Unity 的内置管线中,第二阶段默认会使用内置的 Standard 光照模型;
如果需要自定义,可以替换 Internal-DeferredShading.shader。
2. 延迟渲染的优缺点
优点:
- 与光源数量关系较小:通常只需要少量 Pass(比如「G-buffer + Lighting」), 不会像前向渲染那样随光源数成倍增长;
- 总体效率更多地依赖于屏幕分辨率和 G-buffer 的开销, 而不是场景里到底有多少物体。
缺点:
- 不支持传统意义上的多重采样抗锯齿(MSAA);
- 对半透明物体支持较差,通常要额外走前向管线或单独处理;
- 对显卡有一定要求,特别是在移动端和低端设备上不一定适用。
三、何时选用哪种渲染路径?
可以做一个非常粗略的判断:
-
前向渲染:
- 光源数量不算夸张;
- 需要大量半透明、复杂的材质叠加;
- 面向中低端设备或需要更广的兼容性。
-
延迟渲染:
- 三维场景较大、光源数量多;
- 目标平台以中高端 PC / 主机为主;
- 对半透明有单独方案或需求并不多。
实际项目中,也可以结合:
- 在 Project Settings 中指定一个全局渲染路径;
- 个别相机(例如特殊效果相机)单独改成不同的渲染路径, 以满足特殊需求。
版权声明:本文最初发布于 CSDN「uniGame」,遵循 CC 4.0 BY-SA 协议,转载请附上原文链接及本声明。
原文链接:https://blog.csdn.net/alla_Candy/article/details/121443263