01 / 管线是一条数据加工链
CPU 端先更新场景、准备资源并记录绘制命令。GPU 收到命令后,让大量处理单元并行执行相同着色器。不同 API 的具体名称略有差异,但经典实时渲染的主干相近。
片元不等于最终像素。一个片元只是某图元对某像素样本的候选贡献;它还可能被深度、模板或透明度测试淘汰。
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 提交瓶颈。