如何动态编辑 VBO
Posted
技术标签:
【中文标题】如何动态编辑 VBO【英文标题】:How to dynamically edit VBO's on the fly 【发布时间】:2012-04-11 12:58:54 【问题描述】:我正在寻找一种方法来动态编辑为顶点缓冲区对象显示的数据。我已经尝试过 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 方法,还是我做错了?还有,我应该如何编辑数据才能最有效。
【问题讨论】:
您能提供一些代码来实际更改这些 VBO 吗?或者也许你每帧都重新创建它们? 抱歉有点含糊。我试图从一些大代码中只获取我需要的部分。 【参考方案1】:您可以使用Vertex Array Objects加速绘图部分。
关于上传部分,你的代码没问题;你可以做的是“双缓冲”:保留数据的副本,使用另一个线程处理它(现在多处理器系统很常见),然后使用 glBufferSubData 上传。
另一种选择是使用 SIMD 程序集,但这取决于您的应用程序。
【讨论】:
以上是关于如何动态编辑 VBO的主要内容,如果未能解决你的问题,请参考以下文章