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

Cel*_*tis 15 opengl streaming vertex-buffer

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

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

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

fen*_*fen 13

最好使用固定大小的缓冲区,而不是每帧都重新创建它.

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

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

意见的想法:

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

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

希望有所帮助

  • @Celestis:是的,这是一般的想法.但是,如果您不断更新数据,则应使用2个或3个缓冲区,在这些缓冲区中,您可以在一个周期内更新数据.例如,仅在过去的两天里,我写了一个小的"示波器"来显示实验中DAQ系统提供的波形......速率为1.5GSamples/sec; 即我要以1.5GByte/s的速率更新VBO. (4认同)
  • @Celestis:是的,就像所有内存分配一样,glBufferData是一个缓慢的操作.然而glBufferSubData非常快,就像glMapBuffer [Range]和glUnmapBuffer一样.顺便说一句,在客户端/ CPU端分配内存也很慢; 如果你告诉OpenGL分配一些内存,它必须在GPU和CPU端都这样做.所以最好避免.预分配一个只使用子集的大缓冲区是可行的方法. (3认同)

Cal*_*602 5

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