2011-05-06 41 views
3

我目前使用glDrawElements渲染使用多個VBO(頂點,顏色,紋理和索引)。我發現很少的頂點是共享的,所以我想切換到glDrawArrays和一個交錯的VBO。使用glDrawArrays繪製交錯的VBO

我一直無法找到一個清晰的例子,創建一個交錯的VBO,並添加一個四元或三元(垂直,顏色,紋理),和2)做任何需要使用glDrawArrays繪製它。這兩個步驟的代碼是什麼?

回答

7

關閉我的頭頂:

//init 
glBindBuffer(GL_ARRAY_BUFFER, new_array); 
GLfloat data[] = { 
    0.f, 0.f, 0.f, 0.f, 0.f, 
    0.f, 0.f, 100.f, 0.f, 1.f, 
    0.f, 100.f, 100.f, 1.f, 1.f, 
    0.f, 100.f, 100.f, 1.f, 1.f, 
    0.f, 100.f, 0.f, 1.f, 0.f, 
    0.f, 0.f, 0.f, 0.f, 0.f, 
}; 
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW); 

// draw 
glBindBuffer(GL_ARRAY_BUFFER, new_array); 
glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3, GL_FLOAT, 5*sizeof(GLfloat), NULL); 
glClientActiveTexture(GL_TEXTURE0); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glTexCoordPointer(2, GL_FLOAT, 5*sizeof(GLfloat), ((char*)NULL)+3*sizeof(GLfloat)); 
glDrawArrays(GL_TRIANGLES, 0, 6); 
glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

沒有什麼在此代碼特別神奇。只是看如何:

  • 的數據來源於data陣列被加載:由於是,所有連續
  • 了對於不同的屬性步幅設置爲5 *的sizeof(GLfloat),因爲這是在數據:3個位置浮標和2個texcoord浮標。方面說明,你通常希望這是一個2的力量,不像這裏。
  • 偏移量是從數組開始算起的。所以由於我們先存儲頂點,頂點的偏移量爲0. texcoord在3個位置數據浮點之後存儲,所以它的偏移量是3 * sizeof(GLfloat)。

我沒有在其中包含顏色,原因是:它們通常存儲爲UNORM,這使得初始化代碼更加複雜。您需要將GLfloat和GLubyte存儲在同一個內存塊中。在那個時候,如果你想用代碼來實現它,結構可以提供幫助,但它主要取決於你的數據最終來自哪裏。

+0

我希望可以在帖子發佈後很晚才發表評論 - 但是說'邊注意,你通常希望這是2的冪,不同於這裏'。 如果您只使用位置和tex座標,您會在哪裏填寫額外的數據以使其爲2的冪次?另外,你的意思是數據數組的大小應該是2的冪數還是函數調用的跨度? – 2012-11-07 11:11:52

+0

這真的來自人們嘗試使用過去的經驗,並發現它與兩個冪更好地執行。你不應該接受這個建議,並盲目運行它,而是確認它的改進。它的底部是內存和着色器之間的任何形式的緩存都可能在兩個功率下工作。是的,如果需要,建議是填充數據。同樣,如果你的數據集有任何嚴重的內容,你通常會有很多屬性,並靈活使用哪種數據類型。開發人員明智地選擇「適合」二選一 – Bahbar 2012-11-08 12:19:35