三角带
三角带是一个三角形列表,其中每个三角形都与前一个三角形共享一边,图14.2显示了一个三角带的例子。
注意顶点列出的顺序使得每三个连续的点都能构成一个三角形。例如:
(1)顶点1、2、3构成第一个三角形。
(2)顶点2、3、4构成第二个三角形。
(3)顶点3、4、5构成第三个三角形。
在图14.2中,顶点以构成三角形带的顺序编号。"索引"信息不再需要,因为顶点顺序已经隐式定义了三角形。通常,列表前部有顶点数目,或末尾处有一特殊码表示"列表结束"。
注意到,顶点顺序在顺指针和逆时针间不断变换(见图14.3)。某些平台上,需要指出第一个三角形的顶点顺序,而有些平台上顺序是固定的。
最佳情况下,三角带可用n+2个顶点存储n个面。n很大时,每个三角形平均发送一个顶点,遗憾的是,这只是最佳情况。实践中,很多网格是一个三角形带无法表达的,不仅如此,3个以上三角形共享的顶点还是要多次发送给图形卡。从另一方面说,每个三角形至少要发送一个顶点。但在顶点缓存机制中,有可能将每个三角形发送的顶点数降到一个以下。当然,顶点缓存需要额外的簿记信息(索引和缓存管理数据),可是尽管这些额外信息对单个顶点来讲相对较大,操作速度也会相对下降,但发送顶点数最少的系统在特定平台上速度最快。
假设用一种生成三角带的直接方法,用三角带表示三角网需要的顶点数为t+2s,t为三角形数目,s为三角带数目。每个三角带的第一个三角形对应三个顶点,以后每个三角形对应一顶点。因为我们希望最小化发往图形卡的顶点数,所以三角带的数目应尽可能少,即三角带越长越好。STRIPE方法给出了一种三角带数目接近理论下限的生成手段。
另一个希望减少三角形带数目的原因在于建立各三角形需要额外时间。从另一方面说,分别渲染两个长为n的三角带所需时间长于渲染一个长为2n的三角带,即使这个三角带中的三角形数多于两个分开带中三角形数量的和。于是,我们经常通过使用退化三角形连接多个三角带,从而将整个网格置于一个连续的三角带中,退化的意思是面积为0。图14.4显示了如何重复顶点以将两个三角形合并为一个。
图14.4的含义不太明显,但这里有四个退化三角形用于连接两个三角带从而维持正确的顺指针、逆时针顺序。顶点7、8间的边实际包含两个退化三角形,图14.5指出了图14.4中包含的三角形。
退化三角形面积为0不需要渲染,所以不会影响效率。实际上要发送到图形卡的顶点仍然只是第一列的顶点:
1,2,3,4,5,6,7,8,9,10,11,12,13
这符合我们每三个连续顶点表示一个三角形的约定。
一些硬件(如PS2上的GS)可以跳过三角带中的三角形,方法是通过一个顶点上的标志位指出"不必绘制"此三角形。这给我们一种方法可以有效的从任意点开始新三角形带而不必重复顶点或使用退化三角形。例如,图14.4中的两个三角带可以如图14.6那样连接,其中灰色表示顶点被标记"不必绘制"。
三角扇
三角扇和三角带类似,但不如三角带灵活,所以很少使用。图14.7所示即为三角扇。
三角扇使用n+2个顶点存储n个面,和三角带相同。但是,第一个顶点必须为所有三角形共享,所以实践中不太经常能找到大型三角扇应用的场合。并且,三角扇不能像三角带那样连接。所以,三角扇只能在特殊场合应用,对一般应用来说,三角带更灵活。