CPU-GPU 交互流程
关注点:CPU 如何告诉 GPU “要画什么”?这决定了代码架构和内存管理方式。
立刻渲染模式(Immediate Mode)
每一帧都在 Update 或 OnGUI 里写 DrawButton(),简单直观,但如果物体多,CPU 喊口令会累死。
工作原理
- 核心在于“每帧重新绘制”,无需保存图形对象的复杂状态
- 它具有简单直接、易于动态更新的优点,但因缺乏对象层级的记录,CPU负载通常较高
- 每次调用绘制命令(如 glDrawArrays、DrawPrimitive),GPU 就立即执行渲染,结果直接写入帧缓冲区。
执行流程
1 | 绘制物体A → 立即渲染A → 绘制物体B → 立即渲染B → 绘制物体C → 立即渲染C |
特点
- 无状态管理 - 每次绘制独立,不保存场景信息
- 实时响应 - 调用即渲染,适合简单场景
- 内存占用小 - 不需要额外的场景数据结构
保留模式(Retained Mode)
创建一个 GameObject 或 DOM 节点,之后除非它变了,否则你不用管它,内存占用高(要存菜单),但 CPU 负担轻,库会帮你自动优化。
工作原理
- 与立刻模式相对的渲染模式,其核心逻辑是“由图形库管理场景”
- 在这种模式下,应用程序通过构建一个场景模型(如对象树或场景图)来告诉库“要画什么”,然后库会负责具体的绘制细节、状态维护和按需重绘
- 例如在Unity中,场景模型就是对象树,对象树中的每个对象都包含着对象模型(如Mesh)、材质(如Shader)、变换矩阵等信息
执行流程
1 | 构建场景图 → 提交给引擎 → 引擎优化(剔除、排序、批处理)→ 统一渲染 |
特点
- 层次化管理 - 通过场景图管理物体关系
- 自动优化 - 视锥剔除、遮挡剔除、状态排序
- 延迟执行 - 可以批量处理多个绘制调用,适合大型场景的优化
渲染路径
GPU 收到命令后,“具体怎么算光影”?这决定了显卡的计算逻辑和画面表现。
前向渲染(Forward Rendering)
Unity URP 默认使用的是前向渲染
拿一个零件(物体),直接打磨、上色、抛光(算所有光照),彻底做完再拿下一个零件。
但如果零件受 10 盏灯照,每个零件都要算 10 遍,灯多了会慢。
工作原理
- 图形学中最传统、最基础的渲染路径。
- 它的核心逻辑是“遍历物体,直接着色”:针对场景中的每一个几何物体,依次进行顶点变换、光栅化,并直接在像素着色器中计算所有相关的光照效果,最后输出到屏幕缓冲区。
单 Pass 方式
- 一次绘制计算所有光照
- 光源数量有限(通常 4-8 个)
- 性能随光源线性下降
多 Pass 方式
1 | Pass 1: 渲染物体 + 主光源 |
特点
- 直接计算 - 几何和光照同时处理,适合光源较少的场景
- 透明物体友好 - 天然支持透明度排序
- MSAA 原生支持 - 多重采样抗锯齿直接可用
延迟渲染(Deferred Rendering / Deferred Shading)
Unity HDRP 默认使用延迟渲染
第一批人先给零件分类(记录位置、颜色到 G-Buffer)。第二批人最后统一刷漆(对着 G-Buffer 统一算光照)。
不怕灯多,适合 PC 大作;但费内存(G-Buffer 很大),且处理不了半透明物体。
工作原理
它的核心理念是“先记录信息,最后统一算光照”,流程分为以下两个阶段:
- 几何处理阶段 (Geometry Pass):将场景中的每个物体进行顶点变换、光栅化,并记录所有相关的几何信息(如位置、法线、漫反射颜色、粗糙度等),将物体的几何属性存储在一组被称为 G-Buffer (Geometry Buffer) 的高带宽纹理中
- 光照处理阶段 (Lighting Pass):将G-Buffer里的记录的光照信息进行计算,针对屏幕上的每个像素统一计算最终的光照效果并输出到屏幕缓冲区。
几何 Pass
1 | 对于每个物体: |
光照 Pass
1 | 对于每个像素: |
G-Buffer 结构
1 | RT0: RGB = Albedo颜色 A = Metallic |
每个渲染目标(RT)有 4 个通道:R、G、B、A
RT0: 基础材质属性
1 | ┌─────────────────────────────────────────────┐ |
RT1: 表面细节属性
1 | ┌─────────────────────────────────────────────┐ |
RT2: 发光与环境光遮蔽
1 | ┌─────────────────────────────────────────────┐ |
RT3: 深度/位置信息
1 | ┌─────────────────────────────────────────────┐ |
特点
- 解耦几何与光照 - 几何阶段只处理位置、法线等
- 光照与物体数无关 - 光照计算只针对可见像素
- 需要大量显存 - G-Buffer 占用显著
Credits
https://blog.csdn.net/weixin_70073176/article/details/141165074