乌啦呀哈呀哈乌啦!

欢迎光临,这里是喵pass的个人博客,希望有能帮到你的地方

0%

渲染管线类型

CPU-GPU 交互流程

关注点:CPU 如何告诉 GPU “要画什么”?这决定了代码架构和内存管理方式。

立刻渲染模式(Immediate Mode)

每一帧都在 Update 或 OnGUI 里写 DrawButton(),简单直观,但如果物体多,CPU 喊口令会累死。

工作原理

  • 核心在于“每帧重新绘制”,无需保存图形对象的复杂状态
  • 它具有简单直接、易于动态更新的优点,但因缺乏对象层级的记录,CPU负载通常较高
  • 每次调用绘制命令(如 glDrawArrays、DrawPrimitive),GPU 就立即执行渲染,结果直接写入帧缓冲区。

执行流程

1
绘制物体A → 立即渲染A → 绘制物体B → 立即渲染B → 绘制物体C → 立即渲染C

特点

  1. 无状态管理 - 每次绘制独立,不保存场景信息
  2. 实时响应 - 调用即渲染,适合简单场景
  3. 内存占用小 - 不需要额外的场景数据结构

保留模式(Retained Mode)

创建一个 GameObject 或 DOM 节点,之后除非它变了,否则你不用管它,内存占用高(要存菜单),但 CPU 负担轻,库会帮你自动优化。

工作原理

  • 与立刻模式相对的渲染模式,其核心逻辑是“由图形库管理场景”
  • 在这种模式下,应用程序通过构建一个场景模型(如对象树或场景图)来告诉库“要画什么”,然后库会负责具体的绘制细节、状态维护和按需重绘
    • 例如在Unity中,场景模型就是对象树,对象树中的每个对象都包含着对象模型(如Mesh)、材质(如Shader)、变换矩阵等信息

执行流程

1
构建场景图 → 提交给引擎 → 引擎优化(剔除、排序、批处理)→ 统一渲染

特点

  1. 层次化管理 - 通过场景图管理物体关系
  2. 自动优化 - 视锥剔除、遮挡剔除、状态排序
  3. 延迟执行 - 可以批量处理多个绘制调用,适合大型场景的优化

渲染路径

GPU 收到命令后,“具体怎么算光影”?这决定了显卡的计算逻辑和画面表现。

前向渲染(Forward Rendering)

Unity URP 默认使用的是前向渲染
拿一个零件(物体),直接打磨、上色、抛光(算所有光照),彻底做完再拿下一个零件。
但如果零件受 10 盏灯照,每个零件都要算 10 遍,灯多了会慢。

工作原理

  • 图形学中最传统、最基础的渲染路径。
  • 它的核心逻辑是“遍历物体,直接着色”:针对场景中的每一个几何物体,依次进行顶点变换、光栅化,并直接在像素着色器中计算所有相关的光照效果,最后输出到屏幕缓冲区。

单 Pass 方式

  • 一次绘制计算所有光照
  • 光源数量有限(通常 4-8 个)
  • 性能随光源线性下降

多 Pass 方式

1
2
3
4
Pass 1: 渲染物体 + 主光源
Pass 2: 添加光源1贡献(混合)
Pass 3: 添加光源2贡献(混合)
...

特点

  1. 直接计算 - 几何和光照同时处理,适合光源较少的场景
  2. 透明物体友好 - 天然支持透明度排序
  3. MSAA 原生支持 - 多重采样抗锯齿直接可用

延迟渲染(Deferred Rendering / Deferred Shading)

Unity HDRP 默认使用延迟渲染
第一批人先给零件分类(记录位置、颜色到 G-Buffer)。第二批人最后统一刷漆(对着 G-Buffer 统一算光照)。
不怕灯多,适合 PC 大作;但费内存(G-Buffer 很大),且处理不了半透明物体。

工作原理

它的核心理念是“先记录信息,最后统一算光照”,流程分为以下两个阶段:

  1. 几何处理阶段 (Geometry Pass):将场景中的每个物体进行顶点变换、光栅化,并记录所有相关的几何信息(如位置、法线、漫反射颜色、粗糙度等),将物体的几何属性存储在一组被称为 G-Buffer (Geometry Buffer) 的高带宽纹理中
  2. 光照处理阶段 (Lighting Pass):将G-Buffer里的记录的光照信息进行计算,针对屏幕上的每个像素统一计算最终的光照效果并输出到屏幕缓冲区。

几何 Pass

1
2
3
对于每个物体:
只写入几何信息到 G-Buffer
不计算任何光照

光照 Pass

1
2
3
4
对于每个像素:
从 G-Buffer 读取几何信息
计算所有光照贡献
输出最终颜色

G-Buffer 结构

1
2
3
4
RT0: RGB = Albedo颜色       A = Metallic
RT1: RGB = 法线 A = Roughness
RT2: RGB = 自发光 A = AO
RT3: RGB = 世界坐标/深度

每个渲染目标(RT)有 4 个通道:R、G、B、A

RT0: 基础材质属性

1
2
3
4
5
6
7
8
9
10
11
12
13
┌─────────────────────────────────────────────┐
│ R G B A │
│ Albedo.r Albedo.g Albedo.b Metallic │
└─────────────────────────────────────────────┘

RGB (Albedo): 物体的基础颜色(漫反射颜色)
- 例如:红色物体 → (1.0, 0.0, 0.0)
- 从纹理采样得到

A (Metallic): 金属度 (0.0 ~ 1.0)
- 0.0 = 非金属(电介质):塑料、木材、布料
- 1.0 = 金属:金、银、铜
- 影响高光和反射计算方式

RT1: 表面细节属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌─────────────────────────────────────────────┐
│ R G B A │
│ Normal.r Normal.g Normal.b Roughness │
└─────────────────────────────────────────────┘

RGB (Normal): 世界空间法线向量
- 表示表面朝向
- 单位向量,范围 [-1, 1] 映射到 [0, 1]
- 例如:(0, 1, 0) = 表面朝上
- 用于光照计算(漫反射、高光)

A (Roughness): 粗糙度 (0.0 ~ 1.0)
- 0.0 = 光滑表面:镜子、水面(清晰反射)
- 1.0 = 粗糙表面:混凝土、沙石(模糊高光)
- 控制高光的锐利程度

RT2: 发光与环境光遮蔽

1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌─────────────────────────────────────────────┐
│ R G B A │
│ Emissive.r Emissive.g Emissive.b AO │
└─────────────────────────────────────────────┘

RGB (Emissive): 自发光颜色
- 物体自身发出的光
- 例如:霓虹灯、LED、发光材质
- 不受光照影响,直接叠加到最终颜色

A (AO - Ambient Occlusion): 环境光遮蔽 (0.0 ~ 1.0)
- 0.0 = 完全遮蔽(角落、缝隙)
- 1.0 = 无遮蔽(暴露表面)
- 模拟缝隙中的阴影,增加真实感

RT3: 深度/位置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌─────────────────────────────────────────────┐
│ R G B A │
│ Position.r Position.g Position.b Depth │
│ 或仅使用 Depth 作为单通道 │
└─────────────────────────────────────────────┘

RGB (World Position): 世界坐标
- 像素在世界空间中的 XYZ 位置
- 或者从深度值重建位置(节省显存)

A (Depth): 深度值
- 像素到相机的距离
- 用于重建世界坐标
- 用于后处理效果(雾、景深)

特点

  1. 解耦几何与光照 - 几何阶段只处理位置、法线等
  2. 光照与物体数无关 - 光照计算只针对可见像素
  3. 需要大量显存 - G-Buffer 占用显著


Credits

https://blog.csdn.net/weixin_70073176/article/details/141165074