v4vendeta's homepage

Home | About | Contacts | Blogs| Others

The Graphics Rendering Pipeline

#图形渲染管线

图形渲染管线,也叫做渲染管线,是指在给定虚拟摄像机,三维空间下的物体,光源等条件下,渲染出二维图像的过程,下图展现了使用渲染管线的步骤

在概念上可以将图形渲染管线分为如下几个阶段:

-application应用阶段 -geometryprocessing几何处理 -rasterization光栅化 -pixelprocessing像素处理

其中,每个阶段的处理是并行的,从前一个阶段接受数据,并传入下一个阶段

最慢的管线阶段决定绘制速度,即图像的更新速度,这种速度一般用FPS来表示,也就是每秒绘制的图像数量,或者用Hz来表示


###应用阶段


应用阶段是在CPU上运行的,开发者能够对该阶段发生的情况进行完全控制,可以通过改变实现方法来改变实际性能

应用阶段通常实现的方法有碰撞检测、加速算法、输入检测,动画,力反馈以及纹理动画,变换仿真、几何变形,以及一些不在其他阶段执行的计算,如层次视锥裁剪等加速算法就可以在这里实现。

应用阶段结束后,几何体将以图元(renderingprimitives)的方式传给几何阶段


###几何阶段

几何阶段主要负责大部分多边形操作和顶点操作。可以将这个阶段进一步划分成如下几个阶段

-顶点变换 -顶点着色 -投影 -裁剪 -屏幕映射

(在RTR4中,作者将前两个阶段合并成了一个阶段)

####顶点变换

在屏幕上的显示过程中,模型通常需要变换到若干不同的空间或坐标系中。模型变换的变换对象一般是模型的顶点和法线。物体的坐标称为模型坐标。世界空间是唯一的,所有的模型经过变换后都位于同一个空间中。

不难理解,应该仅对相机(或者视点)可以看到的模型进行绘制。而相机在世界空间中有一个位置方向,用来放置和校准相机。

为了便于投影和裁剪,必须对相机和所有的模型进行视点变换。变换的目的就是要把相机放在原点,然后进行视点校准,使其朝向Z轴负方向,y轴指向上方,x轴指向右边。在视点变换后,实际位置和方向就依赖于当前的API。我们称上述空间为相机空间或者观察空间。 下图显示了视点变换对相机和模型的影响。

####顶点着色

为了产生逼真的场景,渲染形状和位置是远远不够的,我们需要对物体的外观进行建模。而物体经过建模,会得到对包括每个对象的材质,以及照射在对象上的任何光源的效果在内的一些描述。且光照和材质可以用任意数量的方式,从简单的颜色描述到复杂的物理描述来模拟。

确定材质上的光照效果的这种操作被称为着色(shading),着色过程涉及在对象上的各个点处计算着色方程(shadingequation)。通常,这些计算中的一些在几何阶段期间在模型的顶点上执行(vertexshading),而其他计算可以在每像素光栅化(per-pixelrasterization)期间执行。可以在每个顶点处存储各种材料数据,诸如点的位置,法线,颜色或计算着色方程所需的任何其它数字信息。顶点着色的结果(其可以是颜色,向量,纹理坐标或任何其他种类的阴着色数据)计算完成后,会被发送到光栅化阶段以进行插值操作。

通常,着色计算通常认为是在世界空间中进行的。在实践中,有时需要将相关实体(诸如相机和光源)转换到一些其它空间(诸如模型或观察空间)并在那里执行计算,也可以得到正确的结果。 这是因为如果着色过程中所有的实体变换到了相同的空间,着色计算中需要的诸如光源,相机和模型之间的相对关系是不会变的。

####投影

在光照处理之后,渲染系统就开始进行投影操作,即将视体变换到一个对角顶点分别是(-1,1,-1)和(1,1,1)单位立方体(unitcube)内,这个单位立方体通常也被称为规范立方体(CanonicalViewVolume,CVV)。

目前,主要有两种投影方法,即:

正交投影(orthographicprojection,或称parallelprojection)

透视投影(perspectiveprojection)。

两种投影方式的主要异同点:

正交投影。正交投影的可视体通常是一个矩形,正交投影可以把这个视体变换为单位立方体。正交投影的主要特性是平行线在变换之后彼此之间仍然保持平行,这种变换是平移与缩放的组合。

透视投影。相比之下,透视投影比正交投影复杂一些。在这种投影中,越远离摄像机的物体,它在投影后看起来越小。更进一步来说,平行线将在地平线处会聚。透视投影的变换其实就是模拟人类感知物体的方式。

正交投影和透视投影都可以通过4x4的矩阵来实现,在任何一种变换之后,都可以认为模型位于归一化处理之后的设备坐标系中。

虽然这些矩阵变换是从一个可视体变换到另一个,但它们仍被称为投影,因为在完成显示后,Z坐标将不会再保存于的得到的投影图片中。通过这样的投影方法,就将模型从三维空间投影到了二维的空间中。

####裁剪

只有当图元完全或部分存在于视体(也就是上文的规范立方体,CVV)内部的时候,才需要将其发送到光栅化阶段,这个阶段可以把这些图元在屏幕上绘制出来。

不难理解,一个图元相对视体内部的位置,分为三种情况:完全位于内部、完全位于外部、部分位于内部。所以就要分情况进行处理:

当图元完全位于视体内部,那么它可以直接进行下一个阶段。

当图元完全位于视体外部,不会进入下一个阶段,可直接丢弃,因为它们无需进行渲染。

当图元部分位于视体内部,则需要对那些部分位于视体内的图元进行裁剪处理。

对部分位于视体内部的图元进行裁剪操作,这就是裁剪过程存在的意义。裁剪过程见下图。

####屏幕映射

只有在视体内部经过裁剪的图元,以及之前完全位于视体内部的图元,才可以进入到屏幕映射阶段。进入到这个阶段时,坐标仍然是三维的(但显示状态在经过投影阶段后已经成了二维),每个图元的x和y坐标变换到了屏幕坐标系中,屏幕坐标系连同z坐标一起称为窗口坐标系。

假定在一个窗口里对场景进行绘制,窗口的最小坐标为(x1,y1),最大坐标为(x2,y2),其中x1<x2,y1<y2。屏幕映射首先进行平移,随后进行缩放,在映射过程中z坐标不受影响。新的x和y坐标称为屏幕坐标系,与z坐标一起(-1≦z≦1)进入光栅化阶段。

屏幕映射阶段的主要目的,是将之前步骤得到的坐标映射到对应的屏幕坐标系上。

.. ... ...