虎书 第一章 图形流水线

发布时间 2023-05-20 16:34:21作者: YangShusen'

图形流水线

1.GPU

在了解图形流水线之前,我们先了解一下电脑是如何将图像绘制到屏幕上的。GPU的功能最简单、直接的描述就是:它处理需要显示输出的数据。一旦计算机系统中有GPU,人们在显示器上看到的一切都是它计算的结果。

一块现代GPU的工作流程基本是这样的:
\(①\)获得三维模型,这些模型是用顶点坐标和色彩信息组成的(CPU)
\(②\)对这些顶点的位置进行一系列的变换,然后投影到帧缓存上(GPU)
投影的同时,GPU根据显示器的大小和分辨率对投影结果进行裁剪、光栅化;每个帧缓存里的像素或者像素多边形的色彩经过GPU的一系列变换;最后的结果被GPU输出到显示器上。

这一系列的工作是先后有序、不可颠倒的,前面步骤的输出是后面步骤的输入。我们把这一连串的图形处理任务形象地称为图形流水线(graphics pipeline),或者图形管线。图形流水线的入口是顶点坐标和颜色信息,输出的是一帧适合当前显示器显示的图像。流水线以较高的频率工作(须高于显示器的刷新频率),其间不断有数据从中流过,同时连续的一帧帧图像被输出到显示器上。

2.图形流水线

图形流水线是GPU工作的通用模型。它以某种形式表示的三维场景为输入,输出二维的光栅图像(Raster Images)到显示器,也就是位图。下面依次解释图形流水线中的关键步骤。

1)图形流水线的起点是一个三维模型。可以是我们从三维建模软件中导出的模型,也可以是逆向扫描得到的模型。这些模型都是顶点数据,例如每一个点中都应该带有 RGB 的向量数据。

2)顶点可以用来形成多边形,从而拟合出近似的表面。最常用的是三角化(triangulation),即每相邻的三个点组成一个三角形。接下来每个顶点要经过一系列的逐顶点操作(per-vertex operation)

3)由于显示输出的需要,用户会定义一个视口(view port),即观察模型的位置和角度。然后,模型被投影到与视口观察方向垂直的平面上。这个投影变换(projection transformation)也是硬件加速的。根据视域的大小,投影的结果有可能被裁剪(clipping)掉一部分。

4)接受模型投影的平面是一个帧缓存(frame buffer),它是一个由像素(pixels)定义的光栅化平面。光栅化(rasterization)的过程,实际上就是决定帧缓存上的哪些像素该取怎样的值。通过采样和插值,光栅化器(rasterizer)会决定一幅最接近原投影图像的位图。

5)这些像素或者由像素连成的片段还须经历一些逐片段操作(per-fragment operation),也就是说,它们的颜色也可以根据算法改变。另外,纹理映射(texturing或texture mapping)在这一阶段也会覆盖某些像素的值。另外,对于投影和光栅化的结果,还要判断片段的可见性,也就是遮挡探测(occlusion detection)。

6)最后帧缓存里的结果被刷新到显示器上。该过程以较高的帧频率重复,用户就能在显示器上看到连续的图形变换。

本文截取了GPU图形流水线 中部分内容。