从点列表构建索引缓冲区

时间:2019-01-22 21:59:24

标签: unity3d opengl graphics directx

我有一个二维空间中的点的列表,我需要根据它们构建一个顶点和索引缓冲区(我正在使用Unity)。我无法弄清楚如何以正确的顺序处理这些点。

下面的星号是一个例子,我的输入可以保证是有效的,但在编译时是未知的。

mesh0 = new Mesh();

// vertices for a star shape
List<Vector3> vertices0 = new List<Vector3>();
List<int> triangles0 = new List<int>();

vertices0.Add(new Vector3(150, 0, 0));
vertices0.Add(new Vector3(121, -90, 0));
vertices0.Add(new Vector3(198, -35, 0));
vertices0.Add(new Vector3(102, -35, 0));
vertices0.Add(new Vector3(179, -90, 0));

// this bit is wrong
for(int i = 0; i < vertices0.Count - 1; i++) {
    triangles0.Add(i);
    triangles0.Add(i + 1);
    triangles0.Add(i + 2);
}
mesh0.SetVertices(vertices);
mesh0.SetTriangles(triangles, 0);

在这种情况下,我希望三角形为[0, 1, 2, 2, 3, 4, 0, 4, 3],这将是渲染星形的有效索引缓冲区。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

您的三角形数组将为

0, 1, 2
1, 2, 3
2, 3, 4
3, 4, 5

5个让您失望,但您也只有4个三角形。

在这种情况下,您需要将三角形包裹起来

我建议将三角生成的格式重新设置为:

for(int i = 0; i < vertices0.Count; i++) 
{
     triangles0.Add(i);
     triangles0.Add((i + 1) % vertices0.Count);
     triangles0.Add((i + 2) % vertices0.Count);
}

此处的模运算符将“包裹”您的值,如果它们大于计数。我还从顶点数中删除了-1,因为您实际上并未添加第5个三角形

尽管它形成了五边形,但仍然没有形成星星,并输出以下三角形:

0,1,2
1,2,3
2,3,4
3,4,0
4,0,1

它也有很多重叠的三角形,但是我敢肯定,您可以从这里改装它来做您想做的事