GPU流水线

GPU流水线GPU流水线

起点:

是一个三维模型,由顶点(vertices)构成。顶点列表中的每个顶点是三维坐标系中的坐标,并带有颜色信息。顶点列表(point list)即是流水线的输入数据。

顶点处理:

定点通过三角化(triangulation)来模拟三维模型的表面。

接下来每个顶点要经过一系列的逐顶点操作(per-vertex operation),比如计算每个顶点的光照、每个顶点的坐标变换等。

在现有的GPU中,这些工作由硬件实现的Vertex Shader完成。

视图裁剪:

定义视口(view port),模型进行投影变换和裁剪。这个投影变换(projectiontransformation)是硬件加速的。

光栅化:

将上面生成的图形上的点和线通过一定的算法转换到相应的像素点。

片元操作:

GPU流水线

这些像素或者由像素连成的片段还须经历一些逐片段操作(per-fragment operation)

裁剪测试:(限矩形)scissor test
  • 剪裁测试可以在渲染时用来限制绘制区域,不在矩形区域中的片元被丢弃。
模版测试:stencil test
  • 对每一帧中的每个像素进行测试,通过和一个模板指定的对应像素进行对比决定该像素是否能通过测试,模板缓冲区记录模板信息。
  • 利用模板测试可以达到剪裁效果,并且可以实现不规则的剪裁。
深度测试:depth test
  • 深度缓冲区中保存着渲染表面上每个像素与视点最近物体的距离值。有了深度缓冲区后,无需考虑绘制的顺序。
  • 对于每个新的输入片元,将其与视点的距离和深度缓冲区中的值进行比较,如果输入的片元的深度值小于深度缓冲区中的深度值,则表示它离视点更近,则输入片元的深度将代替深度缓冲区中的值,其颜色值将代替颜色缓冲区中的颜色值。否则,表示当前要绘制的片元在已绘制的部分物体后面,则无需绘制该图形,即丢弃。
混合:blending
  • 把某个片元的颜色(源片元)和颜色缓冲区中的像素颜色(目标片元的像素颜色)进行混合。

这些工作由硬件实现的Pixel Shader(像素着色器)完成。

纹理映射(texturing或texture mapping)并不属于片元操作的一部分,而是另外的模块,只是会在这一阶段也会覆盖某些像素的值。

纹理映射:

顶点单元生成的多边形只构成了3D物体的轮廓,而纹理映射(texture mapping)工作完成对多变形表面的帖图。TMU(Texture mapping unit)即是用来完成此项工作。

最终输出:

由ROP(光栅化引擎)最终完成像素的输出,每帧渲染完毕后,被送到显存帧缓冲区。