几何处理阶段(geometry processing)

计算顶点的位置

计算的结果会被送到光栅化进行插值

计算那些开发人员想要作为顶点数据进行输出的任何参数,例如法线(normal)和纹理坐标(texture coordinate)

实现 MVP 变换后,会对位于标准立方体外的顶点进行裁剪

曲面细分(tessellation):为一个曲面生成数量合适的三角形,兼顾质量和效率

几何着色器(geometry shader):对图元(不是单个顶点)进行扩增、丢弃等操作。

为近处的物体增加更多的三角形,确保近处物体的细节质量更高

选择将这些处理好的数据输入到一个缓冲区中,而不是将其直接输入到渲染管线的后续部分,可以让这些数据被 CPU 读回使用或被GPU后续的步骤使用

将完全位于可视空间内部的图元原样传递给下一阶段

裁剪之后会生成新的顶点,用来替代可视空间之外的那个顶点,新顶点位于线段和可视空间的交点处

对于部分位于可视空间内部,部分位于可视空间外部的图元进行额外的裁剪工作

使用投影变换生成的四维齐次坐标来完成剪切操作,由于齐次坐标的插值通常不是线性的,这里会用到透视除法(perspective division)

将完全位于可视空间之外的图元舍弃,不传递给下一阶段

例如,原本的坐标是 (0.351,0.254,0.705) ,视口宽 800 像素、高 600 像素,经过屏幕映射后输出:(540.4,376.2,0.8525)。
单个方向上,0 号像素的范围是 [0.0,1.0] , k 号像素的范围是 [𝑘,𝑘 +1](注意我们对像素的编号从 0 开始数,0 号像素是第一个像素)。
因此,此坐标会对应横向上 540 号像素,纵向上 376 号像素。

图元进入这一阶段时,坐标还是三维的。 其中 𝑥 坐标和 𝑦 坐标会被转换为屏幕坐标(screen coordinate),𝑧 坐标会被映射到 [0,1] 的范围中(OpenGL里是 [ −1,1])

对图元进行裁剪操作

流式输出(stream out)

可选的一些对顶点的处理

顶点着色(vertex shading)

有一些任务会使用计算着色器(compute shader),运行在 GPU 上。

由应用程序进行驱动的,它在软件中进行实现,通常运行在 CPU 上

应用阶段(Application)

光栅化阶段(rasterization)

被处理好的待渲染图元(如三角形)

光栅化的核心问题:有哪些像素被这个图元覆盖

屏幕映射(screen mapping)

三角形遍历(triangle traversal):对每个被三角形覆盖的像素进行逐个检查,并生成一个对应的片元(fragment)

图元装配(primitive assembly):把顶点着色器输出的顶点,按照指定的图元拓扑(点 / 线 / 三角)打包组装成一个个独立图元

会根据三角形三个顶点的属性进行插值,获得每个片元的属性

片元着色(fragment shading):通过片元着色器(像素着色器)设置每个片元的颜色值

合并(merging):进行各项测试(模版测试、深度测试等)与混合(blending),并把内容写入帧缓冲

片元处理阶段(fragment processing)

片元(位于三角形内部的像素)

几何图元(点、线、三角形)

MVP 矩阵可能在 CPU 里计算,也可能放到 GPU 里计算

从这个角度来讲,帧缓冲(frame buffer)就是颜色、深度、模版等各个缓冲区的总和

MSAA(多重采样处理)解析如果开了也会在这里进行