0

我正在寻找一种方法来动态编辑为顶点缓冲区对象显示的数据。我已经尝试过 glBufferSubData、glMapBuffer、glBufferData 和其他一些,但是没有运气。我发现耗时的方法是glBindBuffer。我认为我使用 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 和其他变量是其中包含数据的 FloatBuffer。接下来,我以这种方式渲染它们:

    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);

这是我编辑 VBO 的方法:

    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 方法,还是我做错了?而且,我应该如何编辑数据以获得最高效率。

4

1 回答 1

0

您可以使用Vertex Array Objects加速绘图部分。

关于上传部分,您的代码很好;你可以做的是“双缓冲”:保留数据的副本,使用另一个线程处理它(现在多处理器系统很常见),然后使用glBufferSubData上传。

另一种选择是使用 SIMD 程序集,但这取决于您的应用程序。

于 2012-04-13T20:36:22.667 回答