OpenGL。使用 glBufferData 更新顶点缓冲区

标签 opengl streaming vertex-buffer

我正在使用 OpenGL实现某种批量绘图。为此,我创建了一个 vertex buffer来存储数据。

注意:这个缓冲区通常会在每一帧上更新,但永远不会减少大小(但仍然可以增加)。

我的问题是:使用 glBufferData 在技术上是否正确? (使用 s treaming write-only mode )来更新它(而不是例如 glMapBuffer )?我想没有必要映射它,因为完整的数据已经更新,所以我一次发送一个完整的包。如果当前缓冲区大小小于我发送的大小,它会自动增加,不是吗?我现在才确定它真正工作的方式(也许它会在每次调用时重新创建缓冲区,不是吗?)。

最佳答案

最好有固定大小的缓冲区并且不要每帧都重新创建它。

您可以通过以下方式实现:

  • 创建最大大小的缓冲区,例如 1000 个顶点的空间
  • 仅用新数据更新缓冲区的开头。因此,如果您更改了 500 个顶点的数据,则使用 glMapBuffer
  • 填充缓冲区的前半部分。
  • 绘制时更改绘制顶点的数量。例如,您可以仅使用整个 1000 个顶点缓冲区中的某个顶点范围(例如,从 200 到 500)。使用 glDrawArrays(mode, first, count)

  • 来自评论的想法:
  • glMapBufferRange 和 glBufferSubData 也可以提供帮助
  • 还要考虑缓冲区的双缓冲

  • 链接:http://hacksoflife.blogspot.com/2010/02/double-buffering-vbos.html

    希望有帮助

    关于OpenGL。使用 glBufferData 更新顶点缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14155615/

    相关文章:

    android - ICS 上的流式音频问题

    c++ - OpenGL 对多个纹理感到困惑

    iphone - 为架构 'GCC 4.2' 选择了不支持的编译器 'i386'

    OpenGL/GLSL - 使用带有多个源的 glShaderSource 来支持包含文件

    Powershell:如何从非常大的文件中流式传输、分页文本?

    使用布局限定符时未缓冲顶点属性的 OpenGL 默认值

    c# - SharpDX 中的动态顶点缓冲区

    OpenGL 顶点缓冲区对象,我可以访问顶点数据以用于其他用途(例如碰撞检测)吗?

    c++ - 当我编译这个需要 GLUT 的 C++ 程序时,如何解决链接器问题?

    c++ - 如何在 fedora/linux gcc++ 上链接 OpenGL/glew/glfw