(一)应用程序阶段。该阶段主要运行在CPU上,由高级编程语言(C/C++,java等)控制,主要完成诸如碰撞检测、场景图建立、空间八叉树更新、视锥裁剪等功能。在该阶段的末端,几何体数据(顶点坐标、法向量、纹理坐标、纹理等)通过数据总线传送到图形硬件上,作为几何阶段的输入。
(二)几何阶段。该阶段主要负责顶点坐标变换和光照计算(“T&L”即Transform & Lighting),该阶段主要运行在GPU上。整个处理流程按先后顺序包括:
模型视图变换:物体坐标系到世界坐标系,再到观察坐标系;
顶点着色(光照计算):一般光照计算放在世界坐标系中进行,当然也可以在观察坐标系中。需要注意的是:顶点法向量在模型文件中属于object space,在GPU的顶点程序中必须将法向量转换到world space中才能使用,如同必须将顶点坐标从object space转换到world space中一样,但两者的转换矩阵是不同的,准确的说,法向量从object space到world space的转换矩阵是world matrix的转置矩阵的逆矩阵;
投影变换:从观察坐标系到视锥体空间,再到规范立方体空间。有两种常用的投影方法,即正投影(亦称为平行投影)和透视投影。投影变换将物体从观察坐标系最终转换到位于(-1,-1,-1)到(1,1,1)单位立方体内。这个单位立方体又被称为规范立方体(Canonical view volume, CVV)。CVV的近平面(梯形体较小的矩形面)的X、Y坐标对应屏幕像素坐标(左下角是0、0),Z坐标则是代表画面像素深度。正投影和透视投影的变换都可由一4×4的矩阵构建,而在进行任一种变换后,模型被认为处于规格化设备坐标系。变换后的X, Y坐标映射到屏幕上进行显示,Z坐标不再使用。通过这样的方法模型从三维空间投影到二维上。
裁剪变换:在规范立方体中进行。裁剪变换后,只有在单位立方体内的图元(相应地处于可视体内的图元)才需要后续的处理。因此,在单位立方体外的图元将被丢弃而完全在内的图元将被保留。与单位立方体相交的图元会被单位立方体裁剪,新的顶点会生成而旧的会被丢弃。裁剪变换操作通常被固化在硬件上了,无法进行可编程处理。
屏幕映射:从规范化坐标系到屏幕坐标系。进入这阶段的坐标仍然为三维的,其中图元的X、Y坐标被变换到屏幕坐标系中,而屏幕坐标系与Z坐标一并为窗口坐标系(这些新的X、Y坐标与Z坐标(-1≤Z≤1)一道进入光栅阶段)。下图描述了屏幕映射的过程。
(三)光栅阶段。该阶段最终计算屏幕上每像素的颜色值,即从二维顶点所处的屏幕空间(所有顶点都包含来自几何阶段的Z值即深度值,及各种与相关的着色信息)到屏幕上的像素的转换。与几何阶段相似,该阶段细分为几个功能阶段:三角形设定,三角形遍历,像素着色和融合。
三角形设定:这一过程又被称作图元装配(Primitive Assembly)。之前的流水线都是对顶点处理,这一阶段将顶点按照几何关系装配成几何图元(三角面片),为下一阶段的三角形内部像素插值做准备。这一阶段会根据多边形的朝前或朝后会丢弃一些多边形。这个过程被称为挑选(culling)。
三角形遍历:这一过程又被称作光栅化。经过图元装配的多边形经过光栅化后形成像素位置的集合和片段的集合。光栅化决定哪些像素被图元覆盖。当光栅化后,一个图元拥有的顶点数目和产生的片段之间没有任何关系。例如,一个由三个顶点组成的三角形占据整个屏幕,因此需要生成上百万的片段。一个片段有一个与之相关联的像素位置、深度值和经过插值的参数,例如颜色,第二(反射)颜色和一个或多个纹理坐标集。这些各种各样的经过插值的参数是来自变换过的顶点,这些顶点组成了某个用来生成片段的几何图元。你可以把片段看成是潜在的像素。如果一个片段通过了各种各样的光栅化测试(在光栅操作将做讨论),这个片段将被用于更新帧缓存中的像素。三角形设定及三角形遍历阶段通常被固化的硬件实现。这一过程结束后,输入图元集合(三角网格集)已经对应到像素。下一阶段将是逐像素赋值。
像素着色:所有逐像素的着色计算都在这阶段进行,使用插值得来的着色数据作为输入。最终的结果为一或种将被传送到下一阶段的颜色。不像三角形建立和遍历那样通常运行在专用的电路半导体上,像素着色阶段在可编程GPU内核上运行,大量的技术可以在这里使用,其中最重要的技术之一为纹理贴图。
融合:又称光栅操作(RasterOperations)或片段操作(fragment Operations)阶段。这一阶段实现的功能有消除遮挡面(深度测试)、绘制半透明效果(alpha测试)、景深,反锯齿,软影(模板测试)等。
形象化的图形渲染流水线:
下图中的两个三角形被光栅化了。整个过程从顶点的变换和着色开始。下一步,图元装配从顶点创建三角形,如虚线所示。之后,光栅化用片段填充三角形。最后,从顶点得到的值被用来插值,然后用于贴图和着色。注意仅仅从几个顶点就产生了许多片段。
可编程图形流水线:
当今图形硬件设计上最明显的趋势是在图形处理器内提供更多的可编程性。下图显示了一个可编程图形处理器的流水线中的顶点着色器(Vertex Shader)和片元(像素)(fragment Shader)处理器。Shader language目前主要有3种语言:基于OpenGL的GLSL,基于Direct3D的HLSL,还有NVIDIA公司的Cg语言。
参考:
1康玉之《GPU编程与CG语言之阳春白雪下里巴人》
2《 Real Time Rendering》第二章图形渲染管线
http://www.cnblogs.com/alonecat06/archive/2012/09/24/2700747.html
33D图形渲染管线:http://blog.sina.com.cn/s/blog_6ad33d3501014pi1.html
4 Opengl渲染管线:http://blog.csdn.net/lxdfigo/article/details/8457850
5透视投影详解:http://www.cnblogs.com/graphics/archive/2012/07/25/2582119.html