天天看点

5.5.3 顶点索引

如已经提到的,三角形是用于固体的3D对象的基本构建块。下面的代码显示了使用三角形列表(即每三个顶点形成一个三角形)构建一个四和八边形的顶点数组。

Vertex quad[6] = {
  v0, v1, v2, // Triangle 0
  v0, v2, v3, // Triangle 1
};
Vertex octagon[24] = {
  v0, v1, v2, // Triangle 0
  v0, v2, v3, // Triangle 1
  v0, v3, v4, // Triangle 2
  v0, v4, v5, // Triangle 3
  v0, v5, v6, // Triangle 4
  v0, v6, v7, // Triangle 5
  v0, v7, v8, // Triangle 6
  v0, v8, v1 // Triangle 7
};      

指定一个三角形的顶点的顺序很重要,被称为卷绕顺序;见§5.10.2了解详细信息。

正如图5.15示出,通过共享许多相同的顶点形成3D对象的三角形。更具体地说,图5.15a的四边形的每个三角形分享顶点V0和V2。虽然重复两个顶点不是太糟糕,八边形的例子的顶点的重复更为糟糕(图5.15b),因为每个三角形重复的中心顶点V0,并在八角形的外周的每个顶点是由两个三角形共用。在一般情况下,重复的顶点的数目会增加模型的细节和复杂性。

有两个原因,为什么我们不希望重复顶点:

1.增加的内存需求。 (为什么存储相同的顶点数据超过一次?)

2.增加图形硬件的处理。 (为什么处理同样的顶点数据超过一次?)

三角形带在一些情况下有助于重复顶点问题,所提供的几何形状可以被组织在一个带状方式。然而,三角形列表是更灵活的(三角形不需要连接),因此它是值得设计一种方法以除去三角形列表的重复顶点。

解决方案是使用索引。它的工作原理是这样的:我们创建一个顶点列表和一个索引列表。顶点列表包括所有唯一顶点,索引列表包含值顶点列表的索引来定义顶点如何被放在一起形成三角形。返回到形状如图5.16,四边形的顶点列表将被构造为如下:

Vertex v[4] = {v0, v1, v2, v3};

索引列表需要被定义如下:

UINT indexList[6] = {0, 1, 2, // Triangle 0

    0, 2, 3}; // Triangle 1

在索引列表中,每三个元素定义一个三角形。因此上述索引列表说,“通过使用顶点v[0],v[1],和v[2]生成三角形0,和利用顶点v[0],V[1],和v[3]生成三角形1“。

同样的,八边形顶点列表被定义如下:

Vertex v [9] = {v0, v1, v2, v3, v4, v5, v6, v7, v8};

索引列表被定义如下:

UINT indexList[24] = {
    0, 1, 2, // Triangle 0
    0, 2, 3, // Triangle 1
    0, 3, 4, // Triangle 2
    0, 4, 5, // Triangle 3
    0, 5, 6, // Triangle 4
    0, 6, 7, // Triangle 5
    0, 7, 8, // Triangle 6
    0, 8, 1 // Triangle 7
};      

在顶点列表中唯一的顶点处理之后,显卡可以通过索引列表把顶点放在一起生成三角形。注意:

1.索引仅仅是整数,作为一个完整的顶点结构尽可能不占用多的内存(顶点结构可以变得很大的,当我们添加更多的组件到它们)。

2.具有良好的顶点缓存排序,图形硬件不会重复的处理顶点。