2012-04-11 78 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组装,但这取决于您的应用程序。