图形渲染管线(2)

1、几何阶段(GPU)

几何阶段主要负责顶点坐标变换、光照、裁剪、投影以及屏幕映射,该阶段基于GPU进行计算,该阶段的末尾得到经过变换和投影之后的顶点坐标、颜色、
以及纹理坐标。其主要工作可以概括为“变换三维顶点坐标”和“光照计算”。我们的显卡信息中通常会有一个标示为“T&L”的硬件部分,T即是Transform,L即是Lighting。那么三维顶点坐标为什么需要变换?如何变换?要知道,我们出入到计算机中的是一系列三维坐标点,但我们最终看到的从视点出发观察到的特定点。我们电脑显示器是二维的,GPU所需要做的,就是把三维顶点数据经过转换绘制到二维屏幕上,并让二维画面看起来有3D效果。顶点的变换涉及一系列的坐标系统,顶点变换过程,就是通过各个变化矩阵(顶点排列),把一个坐标系统下的顶点信息,变化到另外一个坐标系统上(把立体排列转换为平面排列),从而实现3D的顶点数据最终可以在2D屏幕上进行显示。我们来了解一下变换过程中的各个坐标系统。
1.1 坐标系统
根据顶点坐标变换的顺序,主要有如下几个坐标空间:局部坐标系(或称自身Local坐标系、建模坐标系)、世界坐标系、观察坐标系、视口坐标系(屏幕坐标系)。
1.2局部坐标系
局部坐标系用于定义构成物体的三角形单元列表的坐标,它描述的是模型文件本身的顶点与顶点值之间的关系,顶点值是在模型建模时得到的。局部坐标系与场景中的其他物体没有任何的参照关系,这也是局部坐标系与世界坐标系区分的关键。
1.3世界坐标系
构建各种模型时,每个模型都位于其自身的局部坐标系中,而无论在现实世界还是在计算机的虚拟空间中,物体都必须和一个固定的坐标原点进行参照才能够确定自己所在的位置,这是世界坐标系的实际意义所在。位于局部坐标系中的物体通过一个称为世界变换的运算过程变换到世界坐标系中,该变换通常包括平移、旋转、以及比例运算,分别用于设定该物体在世界坐标系中的位置、方向及模型的大小。
1.4图元装配
几何阶段处理结束后,送到光栅化阶段的是一堆三角形面片,所以中几何阶段中需要对顶点进行图元装配。所谓的图元装配,即根据顶点原始的连接关系,还原出模型的网格结构。网格由顶点和索引组成,在之前的流水线中是对顶点的处理,而在这阶段是根据索引将顶点连接中一起,组成线、面单元。然后对超出视口外的三角形进行裁剪(视口裁剪),如果有一个三角形其中一个顶点位于画面外,另外两个顶点位于画面内,我们看到的将是一个四边形,而这个四边形又被划分为两个小的三角形。
这里提到了视口裁剪,实际上裁剪是个很大的概念,裁剪包括了视域裁剪(应用程序阶段)、视口裁剪、背面剔除、遮挡剔除(光栅化阶段)。背面剔除涉及到三角形的顶点绕序问题。每个多边形都有两个侧面,我们将其中一个标记为正面,另一个侧面标记为背面,通常,多边形的背面是不可见的,通过背面剔除操作可以不对物体的背面进行渲染,减少需要绘制的顶点个数。一般来说我们根据右手定则来决定三角形的法向量,如果法向量朝向视点(三角形顶点顺时针绕序)即为正面,反之为背面。在Directx3D中,默认顶点排列顺序为顺时针的三角形单元是正面朝向。但也可以通过SetRenderState方法来修改剔除方式。

2.1 alpha测试
纹理的颜色中含有alpha分量,alpha分量主要用于指定像素的透明度。假定我们为每个像素的alpha分量保留了8位,则该alpha分量的合法区间是[0,255],其中,[0,255]对应透明度[0%,100%]。当像素的alpha值为0时,该像素是完全透明的。如果像素的alpha值为128,其透明度就是50%,而alpha值为255则表示完全不透明。
alpha测试指的是将一个像素点的alpha值和一个固定值比较。如果比较的结果失败,像素将不会被写到显示输出中。
2.2 模板测试
在说明模板测试之前,我们需要先介绍一下模板缓存。
模板缓存与深度测试缓存、后台缓存(或颜色缓存,最终显示在屏幕上的缓冲区)的大小(分辨率)完全一致,模板缓存中的像素点与后台缓存的像素点是一
一对应的。模板缓存允许我们动态地、有针对性地决定是否将某个像素写入后台缓存中。模板缓存用与获得某种特效,如镜面效果或阴影效果。在实现镜面效果时,我们在“镜子”这块区域中绘制某个特定物体的映像,而使用模板缓存来阻止物体映像在“非镜子”的区域中进行绘制。
为了进行这种阻止,就需要使用模板测试。判断是否将某个像素写入后台缓存的决策过程,称为模板测试。
2.3 深度测试
当两个物体有前后位置关系时,位于前面的物体会将后面的物体部分或全部遮挡。这时为了优化考虑,GPU不应该绘制被遮挡的片段,这种行为称为遮挡剔除。为了更好了解遮挡剔除与深度测试,我们先来看看深度缓存。深度缓存是一个只含有特定像素的深度信息而不含图像数据的表面。深度缓存为最终绘制图像中的每一个像素都保留了一个深度项。所以,当所绘制的图形的分辨率为640480时,深度缓存中将有640480个深度项。深度缓存用于计算每个像素的深度值并进行深度测试,深度测试的基本内容是依据深度值让处于同一位置的不同像素进行竞争,以选出该写入该位置的像素,距离摄像机最近的像素获胜,并被写入深入缓存的对应位置上。这样做是合理的,因为距离摄像机最近的像素一定会将位于其后方的像素遮挡。
2.4 alpha融合
融合技术能使我们将当前要进行的光栅化的像素的颜色与先前已经光栅化并处于同一位置的像素的颜色进行合成,即将正在处理的图元颜色值与存储中后台缓存中的像素颜色值进行合成。利用该技术,我们可以获得各种各样的效果,尤其是透明效果。不过值得注意的是,为了中场景中绘制透明物体,通常需要对物体按照由后到前的顺序进行混合处理,如果按照任意顺序进行处理将会产生严重的失真。所以在blending(混色)操作之前要来一次Depth test(见下图)。
2.5 抖动处理
在低位深度的图象中,由于颜色总数的限制,有些颜色无法显示出来,为了模拟出那些颜色以提高显示效果,广泛采用了一种称作抖动处理(dithering)的方法,也称半色调处理(Halftoning)。它是指用交替的点图案去模拟在图象中不能使用的颜色的过程。单色图象是最简单的格式,一般由黑色和白色组成,在一些单色图象如黑白照片和有深浅的图案中,会使用各种灰度,这种图象常被称为灰度图象(Grayscale Image)。由于人眼会把一个很细致的黑白相间的图案解释成灰色,所以灰度图象也可使用单色文件格式,数据仍然可以是黑和白。使用黑色或某一种单色的点获得连续的该色灰度的过程就是抖动处理。抖动处理被更多的用在那些低位数彩色图象文件中,与不采用这种处理相比,它具有更好的显示效果。

发布了146 篇原创文章 · 获赞 28 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_38498942/article/details/104504224