GPU图形绘制管线

一个讲图形编程和CG的PDF,回味了一下图形渲染管线,整理一下贴上来。

作者:康玉之,[email protected]

 

第2章GPU图形绘制管线

 

图形绘制管线分为三个主要阶段:应用程序阶段、几何阶段、光栅阶段。

应用程序阶段,使用高级编程语言(C、C++、JAVA等)进行开发,主要和CPU、内存打交道,诸如碰撞检测、场景图建立、空间八叉树更新、视锥裁剪等经典算法都在此阶段执行。在该阶段的末端,几何体数据(顶点坐标、法向量、纹理坐标、纹理等)通过数据总线传送到图形硬件(时间瓶颈)。

几何阶段,主要负责顶点坐标变换、光照、裁剪、投影以及屏幕映射,该阶段基于GPU 进行运算,在该阶段的末端得到了经过变换和投影之后的顶点坐标、颜色、以及纹理坐标。

光栅阶段,基于几何阶段的输出数据,为像素(Pixel)正确配色,以便绘制完整图像,该阶段进行的都是单个像素的操作,每个像素的信息存储在颜色缓冲器(color buffer 或者frame buffer)中。

 

几何阶段

 

 

输入到计算机中的是一系列三维坐标点,要使之显示在二维的屏幕上。

根据顶点坐标变换的先后顺序,主要有如下几个坐标空间,或者说坐标类型:Object space,模型坐标空间;World space,世界坐标系空间;Eye space,观察坐标空间;Clip and Project space,屏幕坐标空间。

object space coordinate就是模型文件中的顶点值,这些值是在模型建模时得到的。object space coordinate 与其他物体没有任何参照关系。

我们将一个模型导入计算机后,就应该给它一个相对于坐标原点的位置,那么这个位置就是world space coordinate,从object space coordinate 到world space coordinate 的变换过程由一个四阶矩阵控制,通常称之为worldmatrix。

光照计算通常是在world coordinate space(世界坐标空间)中进行的。

顶点法向量在模型文件中属于object space,在GPU 的顶点程序中必须将法向量转换到world space 中才能使用。和从object space 转换到world space的转换矩阵不同,准确的说,法向量从object space 到world space 的转换矩阵是world matrix 的转置矩阵的逆矩阵。

所谓eye space,即以camera(视点或相机)为原点,由视线方向、视角和远近平面,共同组成一个梯形体的三维空间,称之为viewing frustum(视锥),在这个梯形体中的所有顶点数据是可见的,而超出这个梯形体之外的场景数据,会被视点去除(Frustum Culling,也称之为视锥裁剪)。

裁剪被安排到一个单位立方体中进行,该立方体的对角顶点分别是(-1,-1,-1)和(1,1,1),通常称这个单位立方体为规范立方体(Canonical view volume,CVV)。

我们尤其要注意第一个步骤,即把顶点从viewing frustum 变换到CVV 中,这个过程才是我们常说或者听说的“投影”。主要的投影方法有两种:正投影(也称平行投影)和透视投影。

Primitive Assembly,图元装配,即将顶点根据primitive(原始的连接关系),还原出网格结构。网格由顶点和索引组成,在之前的流水线中是对顶点的处理,在这个阶段是根据索引将顶点链接在一起,组成线、面单元。

所有的裁剪剔除计算都是为了减少需要绘制的顶点个数。

裁减算法主要包括:视域剔除(View Frustum Culling)、背面剔除(Back-Face Culling)、遮挡剔除(Occlusing Culling)和视口裁减等。 

 

 

光栅化阶段

 

 

具体的画线算法,以及区域图元填充算法。通常的画线算法有DDA 算法、Bresenham 画线算法;区域图元填充算法有,扫描线多边形填充算法、边界填充算法等。

 

Pixel operation 又称为Raster Operation,是在更新帧缓存之前,执行最后一系列针对每个片段的操作,其目的是:计算出每个像素的颜色值。在这个阶段,被遮挡面通过一个被称为深度测试的过程而消除,这其中包含了很多种计算颜色的方法以及技术。

1:消除遮挡面
2:Texture operation,纹理操作,也就是根据像素的纹理坐标,查询对应的纹理值;
3:Blending

 Z buffer 应该是大家最为熟悉的缓冲区类型,又称为depth buffer,即深度缓冲区,其中存放的是视点到每个像素所对应的空间点的距离衡量,称之为Z 值或者深度值。

 

 

图形硬件

 

Z 值并非真正的笛卡儿空间坐标系中的欧几里德距离(Euclidean distance),而是一种“顶点到视点距离”的相对度量。

z buffer 中存放的z 值不一定是线性变化的。在正投影中同一图元相邻像素的Z 值是线性关系的,但在透视投影中却不是的。

Stencil buffer,中文翻译为“模板缓冲区”,它是一个额外的buffer,通常附加到z buffer 中。。Stencil buffer 对大部分人而言应该比较陌生,这是一个用来“做记号”的buffer。

Frame buffer,称为帧缓冲器,用于存放显示输出的数据,这个buffer 中的数据一般是像素颜色值。

你可能感兴趣的:(GPU图形绘制管线)