我需要绘制一个包含数千个顶点的缓冲区。我使用VBO来存储数据。
我知道我需要多次更新VBO,但每次只更新一小部分。
因此,我想知道最好的方法是什么:
- 将VBO分成较小的VBO(每个VBO包含大约300个顶点),然后使用1个调用更新单个VBO?
- 使用一个大的VBO,并使用大量的
glBufferSubData()
调用? - 使用
glMapBuffer()
和一个大的VBO?
还有另一种选择,有点像选项3 - 使用一个大的VBO(可能使用GL_STREAM_DRAW
模式),每帧重置一次(通过调用glBufferData
并传入NULL
缓冲指针和相同的大小)。然后立即使用glMapBuffer
将其映射。缓冲区在填充时保持映射状态,然后在绘制之前取消映射。重复此过程。
对glBufferData
的调用告诉OpenGL旧的缓冲区内容不再需要,因此glMapBuffer
不必等待GPU完成。
这种方法似乎是由vertex_buffer_object
扩展官方认可的。请参考“使用映射缓冲对象的顶点数组”示例:
http://www.opengl.org/registry/specs/ARB/vertex_buffer_object.txt
这表明OpenGL(或驱动程序?)将会监视这种行为,并在发现时安排事情以使其高效执行。如果您的缓冲区很小,则认为glBufferData或glMapBuffer是更好的解决方案。100000 * sizeof(float) * 3 ~= 1MB
。那应该没有问题。