OpenGL VBO更新数据

Pub*_*bby 15 c++ opengl buffer vbo

我必须绘制一个包含几千个顶点的缓冲区.我正在使用vbo来存储数据.

我知道我将不得不多次更新VBO - 但一次只能处理一小部分.

所以我想知道这样做的最佳方法是:

  1. 将VBO拆分为较小的VBO(保持300个顶点)然后用1个调用更新单个VBO?
  2. 一个大的VBO并使用大量glBufferSubData()电话?
  3. 使用glMapBuffer()和一个大的VBO?

小智 10

还有另一种选择,这是有点像选项3 -使用一个大VBO(可能与GL_STREAM_DRAW模式),该重置每个帧(通过调用glBufferDataNULL缓冲区指针和相同尺寸的各时间)然后glMapBuffer-ed马上.缓冲区在填充时保留映射,然后在绘制之前取消映射.重复.

调用glBufferData告诉OpenGL不需要旧的缓冲区内容,因此glMapBuffer不必等待确保GPU完成GPU.

这种方法似乎是由vertex_buffer_object扩展正式批准的方法.请参阅"使用映射的缓冲区对象的顶点数组"示例:

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

这表明OpenGL(或驱动程序?)将会关注这种行为,并且(当发现时)安排事情以便有效地执行.


tib*_*bur 2

  1. 听起来不是一个好主意:它迫使您在多次调用中绘制它,同时更改每个绘制调用之间的绑定缓冲区。
  2. 如果你的缓冲区很大的话可能会成功。
  3. 整个缓冲区肯定会上传到 GPU。这肯定与 glBufferData 一样高效,但您可以异步执行。

如果您的缓冲区很小,则认为 glBufferData 或 glMapBuffer 是更好的解决方案。100000 * sizeof(float) * 3 ~= 1MB。应该没有问题。