16

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

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

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

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

2 回答 2

10

还有另一个选项,有点像选项 3 - 使用一个大 VBO(可能带有GL_STREAM_DRAW模式),每帧重置(通过每次glBufferData使用NULL缓冲区指针和相同大小调用)然后glMapBuffer立即 -ed。缓冲区在填充时保留映射,然后在绘制之前取消映射。重复。

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

这种方法似乎是vertex_buffer_object扩展程序正式认可的方法。请参阅“使用映射缓冲区对象的顶点数组”示例:

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

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

于 2011-01-31T21:41:29.257 回答
2
  1. 听起来不是一个好主意:它会强制您在多个调用中绘制它,同时更改每个绘制调用之间的绑定缓冲区。
  2. 如果您的缓冲区很大,可能会奏效。
  3. 整个缓冲区肯定会上传到 GPU。这肯定会和一个 glBufferData 一样高效,但您可以异步执行。

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

于 2011-01-31T18:36:38.393 回答