我在不同的在线网站中看到不同数量的顶点来表示OpenGL ES中的同一个多维数据集。 例如,这是一个:
float vertices[] = { -width, -height, -depth, // 0
width, -height, -depth, // 1
width, height, -depth, // 2
-width, height, -depth, // 3
-width, -height, depth, // 4
width, -height, depth, // 5
width, height, depth, // 6
-width, height, depth // 7
};
short indices[] = { 0, 2, 1,
0, 3, 2,
1,2,6,
6,5,1,
4,5,6,
6,7,4,
2,3,6,
6,3,7,
0,7,3,
0,4,7,
0,1,5,
0,5,4
};
这是另一个:
float vertices[] = {
//Vertices according to faces
-1.0f, -1.0f, 1.0f, //Vertex 0
1.0f, -1.0f, 1.0f, //v1
-1.0f, 1.0f, 1.0f, //v2
1.0f, 1.0f, 1.0f, //v3
1.0f, -1.0f, 1.0f, //...
1.0f, -1.0f, -1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f, -1.0f,
1.0f, -1.0f, -1.0f,
-1.0f, -1.0f, -1.0f,
1.0f, 1.0f, -1.0f,
-1.0f, 1.0f, -1.0f,
-1.0f, -1.0f, -1.0f,
-1.0f, -1.0f, 1.0f,
-1.0f, 1.0f, -1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f, -1.0f, -1.0f,
1.0f, -1.0f, -1.0f,
-1.0f, -1.0f, 1.0f,
1.0f, -1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, 1.0f, -1.0f,
1.0f, 1.0f, -1.0f,
};
哪种表示在OpenGL ES中表现最高(注意它是OpenGL ES而不是OpenGL)?当我想指定照明法线时,哪个是最佳表示。在SO的其他几个方面,我得到的印象是我需要为立方体指定24个顶点,另一个说我需要36个顶点,而另一个说我需要一个不同的数字来获得相同问题的矛盾答案。无论如何,我想知道技术上正确的正确答案。
我知道有一个Triangle Strip或Triangle粉丝等概念用于绘图,但在我的情况下我正在使用:
gl.glDrawElements(GL10.GL_TRIANGLES, mNumOfIndices,
GL10.GL_UNSIGNED_SHORT, mIndicesBuffer);
所以这应该清楚地说明我在问什么。
答案 0 :(得分:20)
如果使用索引,则只需提供8个不同的顶点即可在OpenGL ES中定义多维数据集。例如:
static const GLfloat cubeVertices[] = {
-1.0, -1.0, 1.0,
1.0, -1.0, 1.0,
-1.0, 1.0, 1.0,
1.0, 1.0, 1.0,
-1.0, -1.0, -1.0,
1.0, -1.0, -1.0,
-1.0, 1.0, -1.0,
1.0, 1.0, -1.0,
};
static const GLushort cubeIndices[] = {
0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1
};
在这里使用几何形状的三角形条,我只需要提供14个索引来指定立方体。如果您愿意,可以删除上面的索引并按顺序提供顶点。
genpfault描述了向OpenGL ES提供纯三角形的情况,在这种情况下,您需要36个顶点。如您所见,其中许多顶点都是冗余的,因此条带或索引可以减少您需要发送的几何体。
Eric在评论中提出了一个很好的观点,即如果你需要为每个面(appears to be your goal)提供纹理或颜色,你需要使用24个顶点或索引。您需要这样才能分别对每个面部进行处理。您的特定应用程序的最高性能取决于您运行此硬件的硬件。例如,在iOS设备内的PowerVR芯片上,Apple has this to say:
为了获得最佳性能,请使用您的型号 应该作为单一提交 使用的无索引三角形条带 glDrawArrays只有少量重复 顶点尽可能。如果你的型号 需要复制许多顶点 (因为很多顶点都是共享的 没有出现的三角形 顺序在三角形条带或 因为你的应用程序合并很多 你可以。更小的三角形条) 使用a获得更好的性能 单独的索引缓冲区和调用 而是glDrawElements。有一个 权衡:未编制索引的三角形条带 必须定期复制整个 顶点,而索引三角形 列表需要额外的内存 索引并增加了开销 顶点。为了获得最佳效果,请进 你的模型使用索引和 没有索引的三角形条带,并使用 一个表现最快的。