索引数组包含引用顶点位置数组中的元素的整数。这些整数称为索引。
Unity 使用索引将顶点位置连接到面。构成每个面的索引数量取决于网格的拓扑。
在 Mesh 类中,可使用 Mesh.GetIndices 获取此数据,并使用 Mesh.SetIndices 进行设置。Unity 也会将此数据存储在 Mesh.triangles 中,但此旧属性的效率较低,而且对用户不太友好。
注意:点拓扑不会创建面;相反,Unity 会在每个位置渲染一个点。所有其他网格拓扑都使用多个索引来创建面或边。
例如,对于具有索引数组的网格,而且数组包含以下值:
0,1,2,3,4,5
如果网格具有三角形拓扑,则前三个元素 (0,1,2) 将识别一个三角形,而后三个元素 (3, 4, 5) 将识别另一个三角形。顶点可以贡献的面数没有限制。这意味着同一顶点可以多次出现在索引数组中。例如,索引数组可以包含以下值:
0,1,2,1,2,3
如果网格具有三角形拓扑,则前三个元素 (0,1,2) 将识别一个三角形,而接下来的三个元素 (1,2,3) 将识别与第一个元素共享顶点的另一个三角形。
索引数组中每一组顶点的顺序称为绕线顺序。Unity 会使用绕线顺序来确定面是正面还是背面,进而确定应该渲染面还是剔除面(将其排除在渲染之外)。默认情况下,Unity 会渲染正面多边形并剔除背面多边形。Unity 会使用顺时针绕线顺序,这意味着 Unity 认为索引沿顺时针方向连接的任何面都是正面。
上图演示了 Unity 如何使用绕线顺序。每个面中的顶点顺序决定了该面的法线方向,Unity 会将其与当前摄像机透视的向前方向进行比较。如果法线指向远离当前摄像机的向前方向,则为背面。近处三角形的排序为 (1, 2, 3),这是相对于当前透视的顺时针方向,因此三角形是正面。远处三角形的排序为 (4, 5, 6),从该透视角度看,这是逆时针方向,因此三角形是背面。