繁体   English   中英

OpenGL VBO更新数据

[英]OpenGL VBO updating data

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

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

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

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

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

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

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

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

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

  1. 听起来不是一个好主意:它会强制您在多次调用中绘制它,同时在每次绘制调用之间更改绑定缓冲区。
  2. 如果你的缓冲区很大,可能会做的伎俩。
  3. 整个缓冲区肯定会上传到GPU。 这肯定和一个glBufferData一样有效,但你可以异步地完成它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM