OpenGL VBO updating data

守給你的承諾、 提交于 2019-12-18 12:17:00

问题


I have to draw a buffer that holds a couple thousand vertices. I am using a vbo to store the data.

I know I will have to update the VBO many times - but only in small parts at a time.

So I am wondering what the best method to doing so is:

  1. Split VBO up into smaller VBOs (that hold like 300 verts) and then update individual VBOs with 1 call?
  2. One big VBO and use lots of glBufferSubData() calls?
  3. Use glMapBuffer() and one big VBO?

回答1:


There is another option, which is a bit like option 3 - use one big VBO (probably with GL_STREAM_DRAW mode) that is reset each frame (by calling glBufferData with a NULL buffer pointer and the same size each time) then glMapBuffer-ed right away. The buffer is left mapped as it is filled in, then unmapped just before drawing. Repeat.

The call to glBufferData tells OpenGL that the old buffer contents aren't needed, so the glMapBuffer doesn't have to potentially wait to ensure the GPU is finished with by the GPU.

This approach seems to be the one officially sanctioned by the vertex_buffer_object extension. See the "Vertex arrays using a mapped buffer object" example:

http://www.opengl.org/registry/specs/ARB/vertex_buffer_object.txt

This suggests that OpenGL (or the driver?) will be watching for this sort of behaviour, and (when spotted) arrange things so that it is performed efficiently.




回答2:


  1. Doesn't sound like a good idea: it forces you to draw it in several calls while changing the bound buffer between each draw call.
  2. Might do the trick if your buffer is huge.
  3. The whole buffer will certainly be uploaded to the GPU. This will certainly be as efficient as one glBufferData, but you can do it asynchronously.

If think that glBufferData or glMapBuffer are the better solution if your buffer is small. 100000 * sizeof(float) * 3 ~= 1MB. There should be no problem with that.



来源:https://stackoverflow.com/questions/4854565/opengl-vbo-updating-data

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!