(一)GPU图形绘制管线

来源:互联网 发布:淘宝客服机器人回复 编辑:程序博客网 时间:2024/06/07 10:07

GPU编程与CG语言之阳春白雪下里巴人 》读书笔记

同时参考了:http://www.cnblogs.com/Esfog/p/3534435.html


图形绘制管线(rendering pipeline)描述GPU渲染流程,即给定视点、三维物体、光源、照明模式,和纹理等元素,如何绘制一幅二维图像。 

图形绘制管线分为三个主要阶段: 

(一)应用程序阶段

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


(二)几何阶段

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

        显示屏是二维的,GPU所需要做的是将三维的数据,绘制到二维屏幕上,并到达跃然纸面的效果。顶点变换中的每个过程都是为了这个目的而存在。 

A、顶点坐标变换的先后顺序 :

(1)Object space,模型坐标空间 。模型文件中的顶点值,这些值是在模型建模时得到的 ,与其他模型物体没有任何参照关系 。

(2)world space coordinate ,世界空间坐标系。将一个模型导入计算机后,就有一个相对于坐标原点 的位置,那么这个位置就是world space coordinate,从object space coordinateworld space coordinate的变换过程由一个四阶矩阵控制,通常称之worldmatrix 。光照计算通常是在world coordinate space(世界坐标空间)中进行的。


(3)eye space,摄像机空间。即以camera(视点或相机)为原点,由视线方向、视角和远近平面,共同组成一个梯形体的三维空间,称之为viewing frustum(视锥) 。


在计算机中每次只能从唯一的视角出发渲染物体。在游戏中,都会提供视点漫游的功能,屏幕显示的内容随着视点的变化而变化。这是因为GPU将物体顶点坐标从world space转换到了eye space。 


(4)project and clip space,投影和剪切空间。

一旦顶点坐标被转换到eye space中,就需要判断哪些点是视点可见的。位于viewing frustum梯形体以内的顶点,被认定为可见,而超出这个梯形体之外的场景数据,会被视点去除(Frustum Culling,也称之为视锥裁剪)。这一步通常称之为“clip(裁剪),识别指定区域内或区域外的图形部分的过程称之为 裁剪算法。


从视点坐标空间到屏幕坐标空间(screen coordinate space)事实上是由三步组成: 

1、用透视变换矩阵把顶点从视锥体中变换到裁剪空间的CVV中;

经过图形学前辈们的精心分析,裁剪被安排到一个单位立方体中进行,该立方体的对角顶点分别是(-1,-1,-1)(1,1,1),通常称这个单位立方体为规范立方体(Canonical view volume,CVV) 。把顶点从viewing frustum变换到CVV中,这个过程才是我们常说或者听说的投影。主要的投影方法有两种:正交投影(也称平行投影,orthogonal)和透视投影(perspective)。 

2、在 CVV进行图元裁剪;

3、屏幕映射:将经过前述过程得到的坐标映射到屏幕坐标系上。 

B、图元装配,Primitive Assembly

网格由顶点和索引组成,在之前的流程中是对顶点的处理,在这个图元装配阶段是根据索引将顶点链接在一起,组成线、面单元。 
 

(三)Rasterization 光栅阶段

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


屏幕是由像素矩阵构成的,而我们处理的模型只是由有限的顶点构成的,经过图元装配后形成的基本图元(点线面),我们要把它和

屏幕上的像素区域对应起来,也就是进行像素填充,一般模型的每个顶点都会带有一些基本信息(例如:法线、位置、纹理坐标、颜

色等),即一个三角面其实只有三个顶点是有基本属性的,而其他填充进来的像素区域是并不直接拥有这些基本属性的,他们的属性都

是通过在顶点间差值计算得来的(其实上面提到的像素应该称为片元fragment)。经过这些处理,模型基本在GPU中已经形成了他所

要绘制到屏幕上的样子了。


注意:光照计算属于几何阶段,因为光照计算涉及视点、光源和物体的世界坐标,所以通常放在世界坐标系中进行计算;而雾化以及涉及物体透明度的计算属于光栅化阶段,因为上述两种计算都需要深度值信息(Z值),而深度值是在几何阶段中计算,并传递到光栅阶段的。


图形绘制管线(Rendering Pipeline),蓝色筐是可编程的shader阶段 The blue boxes are programmable shader stages.



0 0
原创粉丝点击