2018-12-03 Shader基础篇-可编程GPU图形绘制管线

一、可编程GPU图像绘制管线

所谓可编程图形绘制管线,就是给定虚拟摄像机、模型、光源等元素输出一副电脑屏幕显示的二维图像。《事实计算机图像学》的书中概况图形绘制管线为三个主要的阶段:应用、几何、光栅阶段

1、顶点坐标空间的转换

   在可编程图形绘制管线中顶点着色器最重要的任务就是将图元顶点的从模型局部坐标空间换到屏幕坐标空间。虽然可编程顶点着色器允许顶点变换的方法很多,但是有些变化过程还是发生在之后的固定功能阶段。当编写顶点着色器程序的时候,理解那些过程 各自发生在那个阶段是非常重要的。

视点转换就是将模型的世界坐标转换成视点所在的坐标系。而通常unity中所说的摄像机视场角就是在坐标轴方向上所展开的角度。

投影转换和裁剪剔除:投影分为正交投影和透视投影。正交投影即近裁剪和远裁剪面一样大。他们的区别就是正交投影投出来的图像没有远近之分,而透视投影有;它们之间的联系就是都要进行裁剪剔除。实际上,投影转换就是将视点坐标系转换成裁剪坐标系,所以处于近、远裁剪面的梯行体外的部分都将被裁剪掉。最后这些转换后的裁剪坐标进行归一化设置,使得所有的坐标值都在-1到1的范围内,在这个阶段坐标仍然是三维的。

图元装配:前面经过顶点变换后得到都只是单个顶点信息,在图元装配阶段会根据顶点的序列和分类信息将顶点装配成几何图元。最后会产生一序列的三角形、线段和点。如图1.4的片段纹理映射和着色,最后到光栅化的阶段。光栅化其实就是一个决定那些像素被几何图元覆盖的过程,屏幕在刷新的过程其实就是在像素不停地被覆盖的过程。光栅化后,一个图元拥有的顶点数目和产生的片段之间没有任何关系。例如,一个由顶点组成的三角形可以占据整个屏幕而需要生成上百万个片段。

片段和像素的区别:在光栅化阶段会把每个几何图元(如三角形)所覆盖的像素分解成像素大小的片段。而像素代表帧缓冲中某个指定位置的内容,如颜色、深度和其他与这个位置相关的值;片段即是经过各种光栅化测试之后得到的将更新一个特定像素的潜在状态。

光栅化操作:将屏幕空间的二维顶点转换为屏幕上的像素。这个阶段会根据许多测试来检查每个片段,这些测试包括剪切、透明度混合、模板和深度测试。这些测试过程会决定最后像素的位置、颜色值,所以任何一项测试不通过这个片段就会被推起掉。

双缓冲机制:为了避免出现闪屏或卡帧的现象,GPU都采用了双缓冲机制,一旦屏幕在后置缓冲器中绘制,后置缓冲器中的内容就会不断与显示在屏幕上的前置缓冲器的内容进行交换。

Z缓冲器:也称深度缓冲器,前面提到的深度测试的过程也即是z缓冲器的处理过程。每个像素都存储着一个Z值,这个Z值是图元到虚拟相机之间的距离。当将一个图元绘制成像素的时候,需要将像素位置处图元Z值与Z缓冲器里的同一像素的Z值进行比较。如果 新得到的Z值远远小于Z缓冲器中的Z值,说明这个图元距离相机更近,因此也需要使用新得到的像素去更新当前图元的信息。反之,则图元信息不变。注意这里提到的是像素的Z值,不是模型距离摄像机的距离Z,像素有可能是前面模型已有可能是后面模型进行覆盖的像素。    当图元经过以上这些变化之后,就可以在屏幕上看到图像。Z缓冲之所以重要,是因为Z值决定了物体之间的相互遮挡关系,如果没有足够的精度,则两个相距很近的物体就会出现随机遮挡的 现象。

透明度混合:为了绘制透明物体,通常需要对物体进行排序。首先,绘制不透明的物体;然后,在不透明他物体的后面,对透明物体按照由后到前的顺序进行混合处理。实时绘制中对于透明度分混合有一定的局限性,如,因为透明度的厚度导致管线的逐步弱化和光线在物体内的折射效果。如果按照任意序列会产生严重的失真,因此对于排序会使用Z缓冲。

模板缓冲:如果一个像素的模板缓冲中存放了1,则表示该像素对应的空间处于阴影体中。所有模板缓冲通常都是处理阴影效果的。

你可能感兴趣的:(2018-12-03 Shader基础篇-可编程GPU图形绘制管线)