3.2 Viewport Transformation & Clipping & Culling 光照完成之后,接着又是一个坐标系的转换,这次是从视点坐标转换到裁切坐标系(Clip coordinate)再转换到屏幕坐标系(screen coordinate)的过程。
就像在前一个Stage的Transformation一样,它们有如下的关系:
Eye coordinate -----------------------------> Clip coordinate -------------------------> Screen coordinate Projection transformation Viewport Transformation
Clip coordinate是将视点坐标进行投影(Projection),还记得第一篇说的吗?在Eye coordinate上,我们的原点就是摄影机,视线方向是-Z轴,加上视角与远近平面,我们创建了一个梯形体的三维空间,近平面(也就是投影平面)是梯形体较小的矩形,远平面是梯形体较大的矩形,而所有在这个梯形体的内的Vertex,就是我们在屏幕上会看见的Vertex。因此超出这个梯形体的场景,都被视点去除(Frustum Culling)掉了。
最后一步是将Clip coordinate的梯形体转换为一个立方体,近平面(梯形体较小的矩形)就是对应到屏幕,其X Y坐标就是屏幕像素的坐标(左下角是0,0),Z坐标则是代表画面的深度(也就是该Vertex离投影面有多远)。
为什么我们在投影完之后还要留下Z坐标的值呢?这是因为「Vertex离投影面的距离」可以用来处理三角面间相互遮盖的情形,也就是哪个三角面在前,哪个三角面在后。这个称作Z-buffer的技术会在之后提到。
3.3 Primitive Assembly & Triangle Setup
流水线进行到这边,已经把与顶点(Vertex)相关的操作完成了,接下来进行的Primitive Assembly,顾名思义是将Vertex根据Primitive,还原出Mesh结构。还记得之前Primitive与Mesh的概念吧?在之前的流水线中是对于顶点的处理,在这个Stage中将Vertex连结起来,组成点、线、或三角形的单元。
之后,将超出屏幕外的三角面进行裁切(Clipping),想象一个三角形的其中一个顶点在画面外,另外两个顶点在画面内。这时我们在屏幕上看到的就是一个四边形了。因此我们把画面外的部份去掉之后,再将剩下的四边形切成两个小三角形。此外,由三角形的顶点顺序,根据右手定则(right-hand principle)来决定三角面哪一面是正面,哪一面是反面,进行背面去除(Back-face Culling)。
以上Clipping与Back-face Culling的部份,主要是为了减少处理的三角面数量,不会看到的三角面就不用进行处理。
于是我们得到了一堆三角面,准备拿去做光栅化(Rasterizing)。
这个步骤在处理三角形的时侯被称作Triangle Setup。当然,Primitive也可以只是线(lines),那么画出来的图形就没有面,只有线框(wireframe)的图形,但是这并不常见,一般来说三角形还是最常见的。
|