3D渲染管线的理解

3D渲染管线也称为渲染流水线,通俗的讲可以理解为一个流程,就是我们准备一些数据,让GPU按照我们的要求,对这些数据进行处理,最后得到一张二维图像。渲染流程主要包括以下几个大的阶段:数据准备阶段、顶点处理阶段、光栅化操作阶段、像素着色阶段。

一、数据准备阶段

这个阶段主要是根据用户提供的顶点及索引信息,构建多边形,主要有点、线段和三角形 。数据填充允许我们提交我们想要的数据,这些数据包括了顶点数据(位置、法线、颜色、纹理)和一些常量(世界矩阵、观察矩阵、投影矩阵、纹理因子等)

二、顶点处理阶段(顶点着色阶段)

这是一个可编程阶段,可以完全由程序员自己来实现,这个阶段的核心是为模型做各种空间变化。

3D中主要以下几种空间:

(1)模型空间:模型空间也叫本地空间或建模空间,这是我们定义物体时物体自身的坐标系,当一个美工人员创建一个物体的三维模型的时候,他选择了一个方便的方向,比例和位置来保存模型的组成顶点,物体的模型空间和其他模型没用任何关系

(2)世界空间:物体的模型空间和其他物体的模型空间是没用任何关系的,而世界空间的主要目的就是给你的场景中的物体提供一个绝对的参考。

(3)视角空间:这个坐标是以摄像机为基准的,以摄像机的位置为原点,摄像机的朝向为Z轴正方向,右边为X轴正方向,上边为Y轴正方向,之所以设置这个坐标系,主要是为了方便投影以及裁剪操作。

(4)投影裁剪空间:这个空间就是世界空间的物体被投影到相应的投影面上之后,继而进行的裁剪操作所在的空间。

上面说到,3D渲染管线的第二步是顶点着色阶段,主要内容为对模型做各种空间变化,空间变化包括一些几个方面:

1.模型空间变化为世界空间:在物体空间中指定的物体被放置到世界空间的方法要依靠建模变换。如:你将一张桌子放置的一个房间里面,你需要旋转,平移,缩放等操作,才能使桌子按照你的要求放置的房间的准确位置,在同一间房间里面我们可以放置同样的桌子模型,使用不同的建模变换,可以使桌子在房间的不同位置,不同的方向放置。

2.世界空间变化为视角空间:从世界空间到视角空间通过相应的视角矩阵来实现,所谓视角空间,我们可以这里理解,就是以摄像机为原点,由视线方向,视角和远近平面共同组成的一个梯形体。也被称之为视锥体,其由近平面和远平面组成。近平面,是梯形体较小的矩形面,同时也是靠近摄像机的平面。远平面,就是梯形体较大的矩形,作为投影平面,在这个梯形体的内部的数据是可见的,超出部分会被剔除,也叫视锥裁剪。在游戏中,屏幕的内容随摄像机的移动而变化,是因为GPU将物体的顶点坐标从世界空间转换为视角空间。

3.视角空间变换为投影裁剪空间:

从视角空间到投影,裁剪空间依靠投影矩阵来实现,投影有两种:正交投影和透视投影,在大多数游戏中用到的都是透视投影,因为这种投影方式与人观察物体的方式是一致的。这个过程其实就是一个投影,裁剪,映射的过程,因为在一个不规则的视锥体内裁剪是一件非常困难的事情,所以将裁剪安排在一个单位立方体中进行,这个立方体被成为规范立方体。关于投影变换,要注意的 一点是,很多人误以为投影即是把三维顶点投影到二维平面上,投影变换后顶点的Z坐标被抛弃,只剩下X,Y坐标用于后面屏幕  变换,实际上,投影变换后Z坐标并没有消失,位于[0,1]之间,屏幕坐标的变换不再使用Z坐标,但Z坐标在后面的输出管理阶段用于深度比较时会发挥重要作用。这个过程是由三个步骤组成:

  3.1,用透视变换矩阵把顶点从视锥体变换到规范化立方体中

  3.2,在规范化立方体内进行裁剪

  3.3,将经过前面两步得到的坐标映射到屏幕坐标系上(屏幕映射)

4.投影裁剪空间变换为屏幕空间:最后一步是取每个顶点的标准化的设备坐标,然后把它们转换为使用像素度量X和Y的最后的坐标系统,它为图形处理器的光栅器提供数据。然后光栅器从顶点组成点,线段或多边形,并生成最后图像的片段。另一个被称为深度范围变换的变换,缩放顶点的Z值到在深度缓冲中使用的深度缓存的范围内。

<顶点着色阶段到此结束>

备注:几何着色阶段。Direcet11加入的新特性,为可选阶段。在这个阶段中,输入为一个完整的多边形,点、线段或三角形。这个阶段直接对输入的多边形进行操作,可以把其消灭,不再往下一个阶段传输;也可以衍生出新的多边形出来。总之,该阶段操作的对象是完整的多边形,相比于顶点着色阶段,其操作的对象是单个的顶点。几何着色阶段由两部分组成:图元装配,三角形处理。到目前为止我们得到了一堆的顶点数据,这一步九是根据这些顶点数据连接关系还原出网络结构,网络由顶点和索引组成,这个阶段九是根据索引将顶点连接到一起,组成线,面单元,然后进行裁剪,如果一个三角形超出屏幕以外,例如两个顶点在屏幕内,一个顶点在屏幕外,这时我们在屏幕上看到的就是一个四边形,然后把这个四边形切成两个小的三角形。

三、光栅操作阶段

这个阶段属于不可编程阶段,完全由硬件实现,主要包括以下几个方面:

1.视口变换 即把投影变换后的顶点X,Y坐标,根据用户设定的视口参数,变换到屏幕上对应的坐标。

2.隐藏面消除 即使经过了裁剪操作,对于每个物体,摄像机只能看到正对着摄像机的一面,对背对着摄像机的一面是看不到的。这一步的任务就是把看不到的这一面消除掉,以免继续处理,影响计算机的性能和效率。为了确定一个多边形

  是正对着还是背对着摄像机,就要用到我们在输入集合阶段指定多边形时的顶点顺序了,默认情况下,D3D规定按顺时针指定的三角形属于正面,逆时针为背面。确定顺时针还是逆时针,可以用如下方法:给出两个向量:E0=V1-V0 E1=V2-V0 对E0和E1进行叉乘操作N=E0XE1  如果N指向摄像机,则为正面 ,否则为背面。

3.顶点属性的插值计算 在输入集合阶段,用户指定的仅仅是一系列的多边形,以三角形为例,每个三角形由三个顶点组成,每个顶点包含一系列的属性,如坐标,法线,纹理坐标等等,在经过顶点着色阶段,视口变换后,这个顶点在屏幕上都有对应的坐标。但为了显示该三角形,仅仅三个顶点显然是不够的,为了计算该三角形所覆盖的屏幕上每个像素的属性,要进行正确的插值计算。

四、像素着色阶段

像素处理阶段是一个最耗时,但也是最能够使你的渲染效果品质更高的地方,像素最终的样子会在此决定,你可以进行纹理映射,纹理混合,模糊,扩散等效果。这个阶段也是完全可编程的一个阶段,也是跟顶点着色阶段一样十分重要的阶段。

  因为在D3D11中,顶点着色阶段和像素着色阶段是程序员实现的两个最基本的阶段,像素着色器,从名字也可以看出,是在像素级别上进行的计算。对于三维空间中投影到屏幕上的每一个多边形,针对其在屏幕上所覆盖每一个像素,逐个进行像素着色计算。这一阶段接受的数据是经过插值计算后的顶点属性。输出的是颜色值,以提供给下一阶段处理。像素着色器给程序员提供了相当多的灵活性和自由度,通过各种不同的算法来计算片段颜色以实现各种特效。

  备注:像素的一些额外处理与输出 当像素经过像素着色阶段处理后,并不能都有机会输出到屏幕上,因为它们还要经过深度测试和模板测试,Alpha测试,经过这些测试后,还要经过Alpha混合,这是于目标缓冲区的混合,就能够实现变透明效果。

  虚拟世界中的五光十色就是因为这个变透明效果而更加生动。

发布了58 篇原创文章 · 获赞 7 · 访问量 3717

猜你喜欢

转载自blog.csdn.net/xy_learning/article/details/104620960