多语言展示
当前在线:927今日阅读:39今日分享:10

Primitive Assembly && Triangle setup culling

介绍从图元装配到像素操作 整个阶段
方法/步骤
1

Primitive Assembly,       图元装配,即将顶点根据 primitive(原始的连接关系), 还原出网格结构。网格由顶点和索引组成,在之前的流水线中是对顶点的处理, 在这个阶段是根据索引将顶点链接在一起,组成线、面单元。之后就是对超出屏 幕外的三角形进行裁剪 。

2

此外还有一个操作涉及到三角形的顶点顺序(其实也就是三角形的法向量朝 向),根据右手定则来决定三角面片的法向量,如果该法向量朝向视点(法向量 与到视点的方向的点积为正),则该面是正面。一般是顶点按照逆时针排列。如 果该面是反面,则进行背面去除操作(Back-face Culling)。在 OpenGL 中有专门 的函数 enable 和 disable 背面去除操作。

裁减

实际裁减是一个较大的概念,为 了减少需要绘制的顶点个数,而识别指定区域内或区域外的图形部分的算法都称 之为裁减。裁减算法主要包括:视域剔除(View Frustum Culling)、背面剔除 (Back-Face Culling)、遮挡剔除(Occlusing Culling)和视口裁减等        处理三角形的过程被称为 Triangle Setup。到目前位置,我们得到了一堆在 屏幕坐标上的三角面片,这些面片是用于做光栅化的(Rasterizing)。

Rasterization 光栅化阶段
1

光栅化:决定哪些像素被集合图元覆盖的过程         经过上面诸多坐标 转换之后,现在我们得到了每个点的屏幕坐标值(Screen coordinate),也知道我 们需要绘制的图元(点、线、面)。但此时还存在两个问题,

2

问题一:点的屏幕坐标值是浮点数,但像素都是由整数点来表示的,如果确 定屏幕坐标值所对应的像素?  问题二:在屏幕上需要绘制的有点、线、面,如何根据两个已经确定位置的 2 个像素点绘制一条线段,如果根据已经确定了位置的 3 个像素点绘制一个三角 形面片?

3

首先回答一下问题一,“绘制的位置只能接近两指定端点间的实际线段位置, 例如,一条线段的位置是(10.48,20.51),转换为像素位置则是(10,21)”(计 算机图形学(第二版)52 页)。 对于问题二涉及到具体的画线算法,以及区域图元填充算法。通常的画线算 法有 DDA 算法、Bresenham 画线算法;区域图元填充算法有,扫描线多边形填 充算法、边界填充算法等,具体请参阅《计算机图形学(第二版)》第 3 章。  到目前: 顶点(vertex)以及绘制图元(线、面)已经对应到像素 (pixel)。

Pixel Operation
1

Pixel operation 又称为 Raster Operation(在文献【2】中是使用 Raster Operation),是在更新帧缓存之前,执行最后一系列针对每个片段的操作,其目 的是:计算出每个像素的颜色值。在这个阶段,被遮挡面通过一个被称为深度测 试的过程而消除,这其中包含了很多种计算颜色的方法以及技术。

2

Pixel operation 包含哪些事情呢?  1:消除遮挡面2:Texture operation,纹理操作,也就是根据像素的纹理坐标,查询对应的纹理值;  3:Blending  4:Filtering,将正在算的颜色经过某种 Filtering(滤波或者滤镜)后输出。 可以理解为:经过一种数学运算后变成新的颜色值。

3

混色,根据目前已经画好的颜色,与正在计算的颜色的透明度(Alpha), 混合为两种颜色,作为新的颜色输出。通常称之为 alpha 混合技术。 当在屏幕 上绘制某个物体时,与每个像素都相关联的哟一个 RGB 颜色值和一个 Z 缓冲器 深度值,另外一个称为是 alpha 值,可以根据需要生成并存储,用来描述给定像 素处的物体透明度。如果 alpha 值为 1.0,则表示物体不透明;如果值为 0,表示 该物体是透明的,

4

从绘制管线得到一个 RGBA,使用 over 操作符将该值与原像素颜色值进行 混合,公式如下: cd =aica +(1−a)cs 【over操作符】a是透明度值(alpha),ca 表示透明物体的颜色,cs 表示混合前像素的颜色 值, cd 是最终计算得到的颜色值。Over 操作可以用于照片混合和物体合成绘制 方面,这个过程称为合成(compositing)。可以联想一下,OGRE 中有一种技术 称为 compositor(合成器)。

5

该阶段之后,像素的颜色值被写入帧缓存中

注意事项
1

所有的裁剪剔除计算都是为了减少需要 绘制的顶点个数。

2

为了在场景中绘制透明物体,通常需要对物体进 行排序。首先,绘制不透明的物体;然后,在不透明物体的上方,对透明物体按 照由后到前的顺序进行混合处理。如果按照任意顺序进行混合,那么会产生严重 的失真。既然需要排序,那么就需要用到 z buffer。

推荐信息