2011-02-17 118 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

相關問題