首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL VBO更新数据

OpenGL VBO更新数据
EN

Stack Overflow用户
提问于 2011-01-31 18:27:27
回答 2查看 11.3K关注 0票数 17

我必须画一个能容纳几千个顶点的缓冲区。我正在使用vbo存储数据。

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

因此,我想知道这样做的最佳方法是:

  1. 将VBO拆分成较小的VBO (容纳300 verts),然后用1次调用?
  2. 、一个大VBO并使用批次的glBufferSubData()调用?
  3. 使用glMapBuffer()和一个大的VBO?H 210G 211更新各个VBO。
EN

回答 2

Stack Overflow用户

发布于 2011-01-31 21:41:29

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

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

这种方法似乎得到了vertex_buffer_object扩展的官方认可。参见“使用映射缓冲区对象的顶点数组”示例:

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

这表明OpenGL (还是驱动程序?)将监视这类行为,并(当发现)安排事情,使它能够有效地执行。

票数 10
EN

Stack Overflow用户

发布于 2011-01-31 18:36:38

  1. 听起来不是个好主意:它迫使您在每次抽签调用之间更改绑定缓冲区时,在几次调用中绘制它。如果缓冲区很大,
  2. 可能会发挥作用。
  3. 整个缓冲区肯定会上传到GPU。这当然和一个glBufferData一样高效,但是您可以异步完成。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4854565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档