在OpenGL ES中绘制多维数据集需要多少个顶点?

ace*_*ace 9 opengl-es

我在不同的在线站点中看到不同数量的顶点来表示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
                         };
Run Code Online (Sandbox Code Playgroud)

这是另一个:

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,
                                    };
Run Code Online (Sandbox Code Playgroud)

哪种表示在OpenGL ES中表现最高(注意它是OpenGL ES而不是OpenGL)?当我想指定照明法线时,哪个是最佳表示.在SO的其他几个方面,我得到的印象是我需要为立方体指定24个顶点,另一个说我需要36个顶点,而另一个说我需要一个不同的数字来获得相同问题的矛盾答案.无论如何,我想知道技术上正确的正确答案.

我知道有一个Triangle Strip或Triangle粉丝等概念用于绘图,但在我的情况下我使用的是:

gl.glDrawElements(GL10.GL_TRIANGLES, mNumOfIndices,
                GL10.GL_UNSIGNED_SHORT, mIndicesBuffer);
Run Code Online (Sandbox Code Playgroud)

所以这应该清楚地说明我在问什么.

Bra*_*son 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
};
Run Code Online (Sandbox Code Playgroud)

在这里使用几何形状的三角形条,我只需要提供14个索引来指定立方体.如果您愿意,可以删除上述索引并按顺序提供顶点.

genpfault描述了向OpenGL ES提供纯三角形的情况,在这种情况下,您需要36个顶点.如您所见,其中许多顶点都是冗余的,因此条带或索引可以减少需要发送的几何体.

Eric在评论中提出了一个很好的观点,即如果你需要为每个面提供纹理或颜色(这似乎是你的目标),你将需要使用24个顶点或索引.你需要这个,以便你可以分别对每个面孔.

特定应用程序的最高性能取决于您运行此硬件的硬件.例如,在iOS设备内的PowerVR芯片上,Apple 有这样的说法:

为了获得最佳性能,您的模型应使用glDrawArrays作为单个无索引三角形条提交,并尽可能少复制顶点.如果您的模型需要复制许多顶点(因为许多顶点由三角形共享的三角形共享,或者因为您的应用程序合并了许多较小的三角形条),您可以使用单独的索引缓冲区并调用glDrawElements获得更好的性能代替.有一个权衡:未编制索引的三角形条必须定期复制整个顶点,而索引三角形列表需要额外的索引内存,并增加查找顶点的开销.为获得最佳效果,请使用索引和未编制索引的三角形条测试模型,并使用速度最快的三角形条.

  • @Brad Larson - 很抱歉在这个旧帖子中发帖,但我认为索引应该是{0,1,2,3,7,1,6,4,7,5,2,4,0,1}来形成正确的立方体.至少你的不适合我.=) (2认同)