2012-04-11 77 views
0

我正在尋找一種方法來動態編輯顯示頂點緩衝區對象的數據。我試過glBufferSubData,glMapBuffer,glBufferData等等,但是沒有運氣。我發現耗時的方法是glBindBuffer。我認爲我正在使用VBOs,但我不完全確定。我的繼承人問題的一些示例代碼:如何動態編輯VBO的動態

verticesId = glGenBuffers(); 
    glBindBuffer(GL_ARRAY_BUFFER, verticesId); 
    glBufferData(GL_ARRAY_BUFFER, verticesBuffer, GL_STREAM_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    normalsId = glGenBuffers(); 
    glBindBuffer(GL_ARRAY_BUFFER, normalsId); 
    glBufferData(GL_ARRAY_BUFFER, normalsBuffer, GL_STREAM_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    texturesId = glGenBuffers(); 
    glBindBuffer(GL_ARRAY_BUFFER, texturesId); 
    glBufferData(GL_ARRAY_BUFFER, texturesBuffer, GL_STREAM_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

的verticesBuffer和其他變量是在他們的數據FloatBuffers。接下來,我使他們這樣說:

glEnableClientState(GL_VERTEX_ARRAY); 

    glBindBuffer(GL_ARRAY_BUFFER, verticesId); 
    glVertexPointer(vertexSize, GL_FLOAT, 0, 0); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

    glBindBuffer(GL_ARRAY_BUFFER, texturesId); 
    glTexCoordPointer(2, GL_FLOAT, 0, 0); 

    glDrawArrays(GL_QUADS, 0, amountOfVertices); 

    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
    glDisableClientState(GL_VERTEX_ARRAY); 

下面是我編輯的維也納組織:

int position = 0; 

    /////////////////////////////////////////////////////////////////// 

    glBindBuffer(GL_ARRAY_BUFFER, verticesId); 

    mapBuffer = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY, null); 

    verticesBuffer = mapBuffer.order(ByteOrder.nativeOrder()).asFloatBuffer(); 

    verticesBuffer.position(position); 

    // ... edit some values in the 'vertices' float array ... 

    verticesBuffer.put(vertices); 

    verticesBuffer.rewind(); 

    glUnmapBuffer(GL_ARRAY_BUFFER); 

    glBindBuffer(GL_ARRAY_BUFFER, 0); 

有什麼辦法,以加快glBindBuffer方法,還是我這樣做不對?而且,我應該如何編輯最高效的數據。

+1

你能否提供一些代碼,讓你真正改變這些VBO?或者你可能每一幀都重新創建它們? – fen 2012-04-11 20:12:32

+0

對不起,它有點含糊。我試圖從一些大代碼中只得到我需要的部分。 – 2012-04-12 11:01:42

回答

0

您可以使用Vertex Array Objects加速繪圖部分。

關於上傳部分,你的代碼是好的;你可以做的是「雙緩衝」:保存數據的副本,使用另一個線程(多處理器系統現在很頻繁)處理它,然後用上傳glBufferSubData

另一種選擇是使用SIMD組裝,但這取決於您的應用程序。