考虑object-order的渲染方式(rasterization),这对应着一系列操作,开始于objects,结束于更新图像上的像素。这些操作就被叫做Graphics Pipeline。

Object-order rendering在速度和效率上有着很大的优势。相比于反复检索被着色像素需要的场景物体,对场景物体中的每一位只需遍历一遍的方法显然快很多。

针对图形管线有两种类型,一种是用来做交互式渲染的api(OpenGL、Direct3D)的hardware pipelines,一种是用来做电影制作的api(RenderMan)的software pipelines。前者要求的是速度快,能够为游戏或者可视化提供快速的交互;后者要求的是图像质量高,要有华丽的视觉效果,还要支持大范围的场景,但是这需要大量的渲染时间。虽然两种管线的目的不同,但是有相当多的部分是相似甚至相同的。本章将关注这些共同的部分。

object-order rendering可以被分解为:(1)栅格化(2)栅格化前的坐标变换(3)栅格化后的像素操作。

对于(2),主要应用的是矩阵变换,前面几章已经做过介绍。对于(3),最常见的就是关于遮挡的z-Buffer。其他许多操作也可以用在不同阶段,从而实现各种各样的渲染效果(pipeline是一样的)。

图形管道可以分为上述四个阶段:(1)场景物体以顶点(vertex)的形式传入VERTEX PROCESSING,然后使用这些顶点的图元被传入RASTERIZATION。(2)RASTERIZATION将这些图元分为不同的片段(fragment,像素),一个片段对应一个图元包括的像素,片段将被送到FRAGMENT PROCESSING进行处理。(3)在FRAGMENT PROCESSING中,每个片段会被并行处理,并将处理结果送入BLENDING。(4)在BLENDING中,每个片段的处理结果将被组合。

本章将从栅格化开始,然后通过举例说明几何和像素阶段的目的。

1 Rasterization

栅格化和栅格器是任何图形管道的中心。对于传入的每一个图元,栅格器会执行两个操作:

(1)列举被图元覆盖的像素

(2)往图元里的像素插入“属性值”(由顶点属性值插值得到)

栅格器的输出是一堆片段,每一个片段对应被图元覆盖的一个像素,并且带着自己的一组属性值。

本章介绍栅格化主要是用来渲染3D场景,同样的方法也可以用来绘制2D图形。现在大部分2D图形的绘制也是利用3D图形系统。

1.1 Line Drawing

对于给定两点屏幕坐标$(x0, y0)$和$(x1, y1)$,直线绘制命令需要绘制一些“reasonable”的像素来让直线看上去像直线。绘制这样的直线需要直线公式,而我们拥有两种直线公式——隐式的和参数化的。这节会介绍利用隐式直线表达的方法:

1.2 Triangle Rasterization