OpenGL VBO更新数据

发布于 2024-10-14 21:59:07 字数 300 浏览 4 评论 0原文

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

我知道我必须多次更新 VBO - 但一次只能更新一小部分。

所以我想知道最好的方法是什么:

  1. 将 VBO 分割成更小的 VBO(大约 300 个顶点),然后通过 1 次调用更新各个 VBO?
  2. 一个大型 VBO 并使用大量 glBufferSubData() 调用?
  3. 使用 glMapBuffer() 和一个大的 VBO?

I have to draw a buffer that holds a couple thousand vertices. I am using a vbo to store the data.

I know I will have to update the VBO many times - but only in small parts at a time.

So I am wondering what the best method to doing so is:

  1. Split VBO up into smaller VBOs (that hold like 300 verts) and then update individual VBOs with 1 call?
  2. One big VBO and use lots of glBufferSubData() calls?
  3. Use glMapBuffer() and one big VBO?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

苦妄 2024-10-21 21:59:07

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

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

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

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

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

There is another option, which is a bit like option 3 - use one big VBO (probably with GL_STREAM_DRAW mode) that is reset each frame (by calling glBufferData with a NULL buffer pointer and the same size each time) then glMapBuffer-ed right away. The buffer is left mapped as it is filled in, then unmapped just before drawing. Repeat.

The call to glBufferData tells OpenGL that the old buffer contents aren't needed, so the glMapBuffer doesn't have to potentially wait to ensure the GPU is finished with by the GPU.

This approach seems to be the one officially sanctioned by the vertex_buffer_object extension. See the "Vertex arrays using a mapped buffer object" example:

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

This suggests that OpenGL (or the driver?) will be watching for this sort of behaviour, and (when spotted) arrange things so that it is performed efficiently.

柠北森屋 2024-10-21 21:59:07
  1. 听起来不是一个好主意:它迫使您在多次调用中绘制它,同时更改每个绘制调用之间的绑定缓冲区。
  2. 如果你的缓冲区很大的话可能会成功。
  3. 整个缓冲区肯定会上传到 GPU。这肯定与 glBufferData 一样高效,但您可以异步执行。

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

  1. Doesn't sound like a good idea: it forces you to draw it in several calls while changing the bound buffer between each draw call.
  2. Might do the trick if your buffer is huge.
  3. The whole buffer will certainly be uploaded to the GPU. This will certainly be as efficient as one glBufferData, but you can do it asynchronously.

If think that glBufferData or glMapBuffer are the better solution if your buffer is small. 100000 * sizeof(float) * 3 ~= 1MB. There should be no problem with that.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文