GPU图形绘制管线

图形绘制管线的三个主要阶段##
1、应用程序阶段:
使用高级编程语言(C、C++、Java)进行开发,主要和CPU、内存打交道。诸如碰撞检测,空间八叉树更新,视锥裁剪等经典算法都在此阶段进行。
在该阶段的末端,几何体数据(顶点坐标、法线量、纹理坐标、纹理等)通过数据总线传送到图形硬件。
2、几何阶段:
主要负责顶点坐标变换、光照、裁剪、投影以及屏幕隐射,该阶段基于GPU进行运算,在该阶段的末端得到了经过变换和投影之后的顶点坐标、颜色、以及纹理坐标。
3、光栅阶段:
基于几何阶段的输出数据,为像素(Pixel)正确配色,以便绘制完整图像,该阶段进行的都是单个像素的操作,每个像素的信息存储在颜色缓冲器(color buffer 或者 frame buffer)中。
值得注意的是光照计算属于几何阶段,因为光照计算设计视点、光源和物体的世界坐标,所以通常放在世界坐标体系中进行计算;而雾化以及设计物体透明度的计算术语光栅化阶段,因为上述两种计算都涉及深度值信息(Z值),而深度值信息是在几何阶段计算的,并传递到光栅化阶段的。

2.1 几何阶段###
几何阶段的主要工作是“变换三维顶点坐标”和“光照计算”。
根据顶点坐标变换的先后顺序,主要有如下几个坐标空间,或者说坐标类型:
Object space,模型坐标空间
World space,世界坐标空间
Eye space,观察坐标空间
Clip and Project space,屏幕坐标空间
GPU处理流程图

1、从object space 到 world space
object space coordinate:表示模型文件中的顶点值,这些值是在模型建模时就得到的。object space coordinate与其它物体没有任何的参照关系,这是区分object space和world space的关键。(也可以理解为object space的参考系是模型的自身原点,每个模型都会相对自身有一个参考系。)
我们将一个模型导入一个场景中以后,就会给它一个相对于坐标原点的位置,那么这个位置就是 world space coordinate。(这里的坐标原点就是世界坐标的参考系,所有的模型在世界空间都以这个坐标系作为唯一的坐标系。世界坐标空间主要是为了描述物体与物体之间的相对关系。)
光照计算通常在world coordinate space(世界坐标空间)中进行的,当然也可以在 eye coordinate space中得到相同的光照效果,因为同一观察空间中物体之间的相对关系式保存不变的。
注意
顶点法线量在模型文件中术语object space,在GPU的顶点程序必须将法向量转换到world space中才能使用,如同必须将顶点坐标从object space转换到world space中一样,但是两者的转换矩阵式是不同的,准确的说,法向量从object space转换到world space的转化 矩阵式world matrix的转置矩阵的逆矩阵。
2、从world space到eye space
所谓eye space,即以camera(视点或相机)为原点,由视线方向、视角和远近平面,共同组成的一个梯形的三维空间,称之为viewing frustum(视锥)。

在梯形体内的所有顶点数据时可见的,而超出这个梯形体之外的场景数据,会被视点去除(Frustum Culling,也称之为视锥裁剪)。
3、从eye space 到 project and clip space
裁剪(clip):在视锥体之外的顶点将会被去除掉(Frustum Culling),这一步称之为“Clip”裁剪。
因为在不规则体重裁剪并非易事,所以裁剪会被安排到一个单位立方体中进行,该立方体的对角顶点分别是(-1,-1,-1)和(1,1,1),通常这个单位立方体为规范立方体(Canonical view volume,CVV)。CVV的近平面(梯形体较小的矩形面)的X、Y坐标对应屏幕像素坐标(做下角是(0,0)),Z坐标则是代表画面像素深度。
所以从视点坐标空间到屏幕坐标空间(screen coordinate space)事实上由三步组成:
(1)、用透视变换矩阵把顶点从视锥体重变换到裁剪空间的CVV中;
(2)、在CVV进行图元裁剪;
(3)、屏幕映射,将经过前述过程得到的坐标映射到屏幕坐标系上。
投影:在上述过程中,把顶点从viewing frustum变换到CVV中,这个过程就是我们通常所说的投影。主要的投影方式有两种:正交投影和透视投影。
只有图元完全或部分存在于视锥体内部时,才需要将其光栅化。

2.2 Primitive Assembly and Triangle setup###
Primitive Assembly,图元装配,即将顶点根据primitive(原始的连接关系),还原出网格结构。网格由顶点和索引组成,之前的流水线中是对顶点的处理,在这个阶段是根据索引将顶点连接在一起,组成线、面单元。之后就是对超出屏幕外的三角形进行裁剪。
根据右手定则来决定三角面片的法线量,如果法线量朝向视点(法向量与到视点的方向的点积为正),则该面是正面。一般顶点按照逆时针排列,如果该面是反面,则进行背面去除操作(Back-face Culling)。
所有的裁剪剔除计算都是为了减少需要绘制的顶点个数。
附:裁剪的概念
为了减少需要绘制的顶点个数,而识别指定区域内或区域外的图形部分的算法都称之为裁剪。
裁剪算法主要包括:
视域剔除(View Frustum Culling)
背面剔除(Back-Face Culling)
遮挡剔除(Occlusing Culling)
视口裁剪等
处理三角形的过程称之为Triangle Setup。到目前的位置,我们得到了一堆在屏幕坐标上的三角形面片,这些面片都是用于光栅化的(Rasterizing)。

光栅化阶段##
光栅化:决定哪些像素被集合图元覆盖的过程(Rasterization is the process of determining the set of pixels covered by a geometric primitive)。
通常的画线算法有:DDA算法、Bresenham画线算法。
区域填充算法有:扫描多边形填充算法、边界填充算法等。

2.3.2 Pixel Operation###
Pixel operation又称为Raster operation,是在更新帧缓冲之前,执行最后一系列针对每个片段的操作,其目的是:计算出每个像素的颜色值。
在这个阶段,被遮挡面通过一个被称为深度测试的过程而消除。这齐总包含了很多种计算颜色的方法以及技术。
Pixel Operation主要包括:
1、消除遮挡面。
2、Texture operation,纹理操作,也就是根据像素的纹理坐标,查询对应的纹理直。
3、Blending,混色,根据目前已经画好的颜色,与正在计算的颜色的透明度(Alpha),混合为两种颜色,作为新的颜色输出。
颜色混合公式:
C = a·b+(1-a)d【over操作符】
其中a是透明度值(Alpha),b表示透明物体的颜色,d表示混合前像素的颜色值,C表示最终计算得到的颜色值。
Note:在场景中绘制透明物体,通常需要对物体进行排序。首先,绘制不透明物体;然后,在不透明物体上方,对透明物体按照由后到前的顺序进行混合处理。
4、Filtering,将正在算的颜色经过某种Filtering(滤波或者滤镜)后输出。可以理解为:经过一种数学运算后变成新的颜色值。

图形硬件##
Z Buffer与Z值###


作者:Unity云中客
链接:https://www.jianshu.com/p/2a63cb12d94e



猜你喜欢

转载自blog.csdn.net/u010832643/article/details/79484137
今日推荐