【技术美术】GPU渲染管线概述
【技术美术】GPU渲染管线概述
GPU渲染管线的名称由来
GPU渲染管线指代GPU渲染图形的工作过程及其环境。
GPU的工作方式和狭义上分时的CPU不同,GPU类似早期的批处理系统:
- 工作前需提前配置好输入和工作参数,运行时不可修改,直到工作结束;
- 因为GPU一般是为了渲染像素这样的特定任务,其工作流程固定且有多道工序。
这些特征很像工厂中的流水线,也因此便获得了“渲染管线”的名号,前缀GPU则是用于区分“引擎渲染管线”。

GPU渲染管线中的工作步骤
完全可以把GPU渲染管线看成是一种工厂流水线,那该工厂的产品生产步骤由如下完成:
- 输入装配器阶段:准备渲染管线要用的各种数据以及管线设置的配置。
- 顶点着色器阶段:分析顶点数据确定几何物体在屏幕上的数学位置。
- 分割阶段:可选的能够自动分割几何物体的阶段。
- 壳着色器阶段:提供分割参数和控制点数据。
- 细化器阶段
- 域着色器阶段:根据控制点和权重产生分割后的新顶点。
- 几何着色器阶段:可选的能够根据几何物体点线面再生成新点线面的阶段。
- 光栅化阶段:根据几何物体的数学位置,确认其在屏幕上的物理像素,并插值顶点数据。
- 裁剪测试:剔除超出显示范围(视口)的那些肯定看不见的像素。
- 早期深度测试:提前进行深度测试,以减少无效的片段着色器计算。
- 片段着色器阶段:根据顶点数据和各种其他资源给像素进行最终上色。
- 输出合并阶段:对计算出的新像素数据进行后处理,并决定如何与上次计算的数据混合。
- Alpha测试:旧管线功能,用于根据Alpha进行剔除,目前用
clip()替代,是第一个且可编程的剔除阶段。 - 模板测试:利用可选的模板功能进行像素剔除。
- 深度测试:利用像素的深度位置进行像素剔除。
- 混合:决定新的像素颜色如何写入到颜色附件中。
- Alpha测试:旧管线功能,用于根据Alpha进行剔除,目前用
GPU渲染管线中的资源
缓冲区
缓冲区是GPU中最多的数据类型,实际上下文的纹理、附件也是一种缓冲区,他们的本质都是一个字节数组,只是其数据含义有所不同。
- 顶点缓冲区:存放顶点的缓冲区,顶点数据由用户自行定义,甚至为空也是可以的。
- 索引缓冲区:存储每个基元顶点对应在顶点缓冲区中位置的缓冲区,如果基元是三角形,那每三个索引,描述一个三角形。
- 常量缓冲区:用户自定义的可选只读数据缓冲区,可以提供各种渲染时需要的统一数据,例如时间、矩阵之类。
纹理
纹理对应的就是图片,但需要使用GPU支持的格式进行存储。GPU对其实现了很多特殊功能,例如按0-1插值访问,mipmap等。
- 1D纹理、1D纹理数组
- 2D纹理、2D纹理数组
- 3D纹理
- Cube纹理
附件
每次绘制完成后用于存储最终像素信息的缓冲区。如果将其用于在屏幕上呈现,那一般分辨率与屏幕一致。本质也是纹理,因此每次绘制完后还可以将其反向作为输入。
- 颜色附件:用于存储上次绘制的颜色信息,每次绘制新颜色时,需选择如何覆盖旧数据,例如混合或直接覆盖。
- 深度模板附件:像素可以额外存储深度和掩码信息,用于处理遮挡时的绘制顺序问题,以及利用可选的模板功能来实现自定义效果。
渲染状态
对管线各种功能的设置,告诉GPU如何处理数据,以及提供一些可选功能,常用的设置如下:
- 基元类型:确定要绘制的基元类型(索引缓冲区的数据结构),如点、线、三角面、四边面。
- 混合方式:如何混合颜色附件中的旧数据和要写入的新数据。
- 正面方向和剔除方向:绘制面时可以根据顶点的顺逆时针顺序判断其正反方向,可以决定要绘制哪个方向。
- 深度测试、深度写入、深度偏移:如何进行深度测试,以及是否写入深度,以及对深度的偏移。
- 模板测试和模板写入:如何进行模板测试、以及如何写入模板掩码数据。
着色器
实现对GPU中部分阶段的编程,通过代码的方式具体控制各种绘制效果的实现。
- 顶点着色器
- 壳着色器
- 域着色器
- 几何着色器
- 片段着色器

浙公网安备 33010602011771号