16

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

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

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

4

2 回答 2

14

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

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

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

评论中的想法:

  • glMapBufferRange 和 glBufferSubData 也可以提供帮助
  • 还考虑缓冲区的双缓冲

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

希望有帮助

于 2013-01-04T11:11:01.757 回答
5

除了 fen 和 datenwolf 说的,参见OpenGL Insights 的第 22 章;特别是,它包括各种硬件和技术的时序。

于 2013-01-05T00:04:00.050 回答