我必须绘制一个包含几千个顶点的缓冲区。我正在使用vbo来存储数据。
我知道我必须多次更新VBO - 但一次只能处理一小部分。
所以我想知道这样做的最佳方法是:
glBufferSubData()
来电?glMapBuffer()
和一个大的VBO?答案 0 :(得分:10)
还有另一个选项,有点像选项3 - 使用一个大的VBO(可能是GL_STREAM_DRAW
模式),每个帧重置一次(通过glBufferData
调用NULL
缓冲区指针和每次相同的大小)然后glMapBuffer
- 立即编辑。缓冲区在填充时保留映射,然后在绘制之前取消映射。重复。
对glBufferData
的调用告诉OpenGL不需要旧的缓冲区内容,因此glMapBuffer
不必等待确保GPU完成GPU。
这种方法似乎是由vertex_buffer_object
扩展正式批准的方法。请参阅“使用映射缓冲区对象的顶点数组”示例:
http://www.opengl.org/registry/specs/ARB/vertex_buffer_object.txt
这表明OpenGL(或驱动程序?)会关注这种行为,并且(当发现时)安排事情以便有效地执行。
答案 1 :(得分:2)
如果缓冲区很小,请认为glBufferData或glMapBuffer是更好的解决方案。 100000 * sizeof(float) * 3 ~= 1MB
。应该没有问题。