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

时间:2013-01-04 10:45:07

标签: opengl streaming vertex-buffer

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

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

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

2 个答案:

答案 0 :(得分:12)

最好使用固定大小的缓冲区,不要每帧重新创建它。

您可以通过以下方式实现这一目标:

  • 创建具有最大大小的缓冲区,例如1000个顶点的空间
  • 仅使用新数据更新缓冲区的开头。因此,如果您更改了500个顶点的数据,则使用glMapBuffer
  • 填充缓冲区的前半部分
  • 绘制时更改绘制顶点的数量。例如,您可以仅使用整个1000顶点缓冲区中的某些范围的顶点(例如,从200到500)。使用 glDrawArrays(模式,优先,计数)
来自评论的想法:

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

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

希望有所帮助

答案 1 :(得分:5)

除了fen和datenwolf所说的,请参阅Chapter 22 of OpenGL Insights;特别是,它包括各种硬件和时间的定时。技术。