BK / GRAPHICS NOTES
REAL-TIME / 04

渲染管线:一帧画面如何穿过 GPU

实时渲染把复杂工作拆成连续阶段:程序提交场景,顶点被定位,三角形被覆盖成片元,颜色经过测试后写入屏幕。理解阶段边界,是理解现代图形 API 的主线。

阅读约 11 分钟前置:坐标空间难度:入门

01 / 管线是一条数据加工链

CPU 端先更新场景、准备资源并记录绘制命令。GPU 收到命令后,让大量处理单元并行执行相同着色器。不同 API 的具体名称略有差异,但经典实时渲染的主干相近。

从应用到帧缓冲的渲染管线APPLICATION应用VERTEX顶点ASSEMBLY组装RASTER光栅FRAGMENT片元OUTPUT输出per vertexper fragment
蓝色阶段以顶点为粒度,琥珀色阶段常以片元或样本为粒度。
片元不等于最终像素。一个片元只是某图元对某像素样本的候选贡献;它还可能被深度、模板或透明度测试淘汰。

02 / 顶点阶段决定几何在哪里

顶点着色器对每个输入顶点执行一次。它最重要的输出是裁剪空间位置,也可以输出法线、颜色、纹理坐标等属性,供后续三角形内部插值。

clipPosition = Projection · View · Model · localPosition

GPU 通常从顶点缓冲读取属性,通过索引缓冲复用顶点。顶点着色器不能凭空知道相邻顶点,也不会直接输出一个屏幕像素。

可选的几何阶段

现代管线还可能包括曲面细分、几何着色器或网格着色器。它们能改变图元数量与组织方式,但并非每个绘制都需要;简单任务应优先使用最短管线。

03 / 图元组装与光栅化

顶点被按索引组装成点、线或三角形。GPU 完成视锥裁剪和透视除法后,把三角形投到屏幕;背面剔除可根据顶点绕序去掉不可见朝向。

光栅化判断三角形覆盖哪些样本,并为每个候选片元插值顶点输出。默认插值会做透视校正,使倾斜表面上的纹理不会像贴在屏幕平面上一样扭曲。

数据粒度来源
顶点属性每个顶点缓冲与顶点着色器
图元每个三角形顶点组装
片元输入每个覆盖样本插值器
帧缓冲值每个目标样本输出合并

04 / 片元阶段决定表面看起来怎样

片元着色器读取插值属性、纹理和材质参数,计算一个或多个颜色输出,也可能修改深度或丢弃片元。光照模型的大部分逐像素工作都发生在这里。

输出随后通过深度测试、模板测试和混合。深度测试解决前后遮挡;模板缓冲可限制绘制区域;混合将新颜色与已有颜色组合,是透明与合成的基础。

C_out = C_src × F_src + C_dst × F_dst
透明物体通常需要排序。常见 alpha 混合依赖已有背景颜色,结果与绘制顺序有关;一般先绘制不透明物,再从远到近绘制透明物。

05 / GPU 并行不意味着所有工作都免费

  • 顶点瓶颈:顶点过多、变换复杂或顶点复用差。
  • 片元瓶颈:分辨率高、过度绘制严重、着色器或纹理采样昂贵。
  • 带宽瓶颈:大纹理、大量渲染目标或频繁读写显存。
  • 提交瓶颈:绘制调用碎片化,CPU 花大量时间切换状态。

优化前应使用 GPU 调试器与性能分析器确认瓶颈。降低三角形数量无法解决纯片元瓶颈,压缩纹理也未必能解决 CPU 提交瓶颈。