2014-10-31 67 views
0

是否可以使用單個緩衝區來存儲多種類型的數據? 或者我應該使用兩個緩衝區,其中一個存儲頂點數據,另一個存儲索引數據?在OpenGL中使用單個緩衝區對象來存儲多組數據

實施例(利用單個緩存):

GLuint buffer; 
glGenBuffers(1, &buffer); 
glBindBuffer(GL_ARRAY_BUFFER, buffer); 
// Buffer the Vertex Data 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer); 
// Buffer the Index Data 
+0

https://www.opengl.org/wiki/Vertex_Specification_Best_Practices – 2014-10-31 10:05:29

回答

2

是的,它的優良和用於交織的存儲的基礎。每個緩衝區只是其他命令可以指向的一部分內存。設置數據時甚至不需要將其綁定到GL_ELEMENT_ARRAY_BUFFER

你必須確保數據不重疊:

GLuint buffer; 
glGenBuffers(1, &buffer); 
glBindBuffer(GL_ARRAY_BUFFER, buffer); 
//allocate the buffer, passing in null just allocates 
glBufferData(GL_ARRAY_BUFFER, vertexSize+indexSize*sizeof(int), 0, GL_STATIC_DRAW); 
// Buffer the Index Data at the start of the buffer 
glBufferSubData(GL_ARRAY_BUFFER, 0, indexSize*sizeof(int), indexData); 
// Buffer the Vertex Data right after that 
glBufferSubData(GL_ARRAY_BUFFER, indexSize*sizeof(int), vertexSize, vertexData); 

你需要抵消glVertexAttribPointer指針參數,以表示它開始的地方。

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer); 
glVertexAttribPointer(0, 3, GL_FLOAT, false, sizeof(vertex), (void*)(indexSize*sizeof(int))); 
glVertexAttribPointer(1, 3, GL_FLOAT, false, sizeof(vertex), (void*)(indexSize*sizeof(int) + 3*sizeof(float))); 
//... 

和繪圖時,你需要在相應的位置通過繪製(0,如果你把它首先你在相應的glBufferSubData呼叫另有規定的偏移量)

glDrawElements(GL_TRIANGLES​, indexSize, GL_UNSIGNED_INT​, 0); 
+0

工程和我理解爲什麼。感謝您提供一個很好的答案,並且有一個很好的理由將這個索引放在開頭。 – 2014-10-31 10:15:37

1

是合法的存儲頂點屬性和索引在同一個緩衝區中。雖然這個規範總是有一些語言令人沮喪。

舊GL規格,直至幷包括3.0,有這樣一段話:由一個未使用的名稱綁定到數組緩衝區和ELEMENT數組緩衝區創建

Buffer對象在形式上是等價的,但GL可以做出不同根據初始綁定選擇存儲實現。在某些情況下,性能將通過將索引和數組數據存儲在單獨的緩衝區對象中,並通過創建具有相應綁定點的緩衝區對象來優化。

與3.1規範開始,僅該段的最後一句仍然存在:

在某些情況下的性能將通過存儲在單獨的緩衝器的對象索引和陣列數據進行優化,並通過創建那些帶有相應綁定點的緩衝區對象。

我不確定忽略此建議的性能差異是否很常見,但它仍然存在於最新的(4.5)規範中。

+0

並且很大程度上取決於驅動程序的實現(規範沒有提到任何內容) – 2014-11-01 18:36:00