2011-02-17 90 views
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 
         }; 

这里是另一个问题:

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的)?当我想为光线指定法线时,这是最好的表现形式。在我的另一篇文章中,我得到的印象是我需要为立方体指定24个顶点,另一个说我需要36个顶点,而另一个说我需要一个不同的数字来获得相同问题的矛盾答案。无论如何,我想知道正确的单一答案,技术上是正确的。

我知道有一个三角地带或三角风扇等的概念,绘制但对我来说,我使用:

gl.glDrawElements(GL10.GL_TRIANGLES, mNumOfIndices, 
       GL10.GL_UNSIGNED_SHORT, mIndicesBuffer); 

所以这应明确澄清我问。

回答

18

如果使用索引,则只需要提供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芯片,苹果has this to say

为了获得最佳性能,您的模型 应作为使用 调用glDrawArrays以尽可能少的单一 没有索引的三角形带复制 顶点越好。如果你的模型 需要许多顶点被复制 (因为许多顶点,如因您的应用程序合并许多 小三角形带不会出现 顺序在三角形带或 三角形共享),您可以 使用获得更好的性能一个 单独的索引缓冲区,并调用 glDrawElements来代替。有一个 权衡:未编制索引的三角形带 必须定期重复整个 顶点,而索引三角形 列表需要额外的内存为 指标,并增加了开销看 了顶点。为获得最佳效果,请使用索引编码和 未折射三角形条测试 您的模型,并使用执行速度最快的 。

+1

如果立方体因面对面而不同,则可能需要额外的顶点。例如,每个面上具有不同颜色的立方体可能需要24个顶点,如果使用glTriangles绘制,则需要36个索引。如果不是立方体的所有边都可见,则可以通过不绘制不可见的面来优化绘图,从而减少索引计数。 – 2011-02-17 19:13:34