关于vbo:OpenGL 2.1:glMapBuffer和用法提示

OpenGL 2.1: glMapBuffer and usage hints

我一直在使用glBufferData,这对我来说很有意义,您必须指定使用提示(例如GL_DYNAMIC_DRAW)。

但是,最近有人建议我在Stack Overflow上使用glMapBufferglMapBufferRange修改顶点数据的非连续块。

使用glMapBuffer时,似乎在任何时候都没有指定使用提示。因此,我的问题如下:

  • 如果您从未在该VBO上调用glBufferData,在该VBO上使用glMapBuffer是否有效?
  • 如果是这样,由于未得到提示,OpenGL如何猜测其用法?
  • glMapBufferglBufferData的优点/缺点是什么? (我知道他们做的事情不完全相同。但是似乎通过使用glMapBuffer获取指针,然后写入该地址,您可以执行glBufferData相同的操作。)

  • Is it valid to use glMapBuffer on a given VBO if you've never called glBufferData on that VBO?

否,因为要映射一些内存,因此必须首先分配它。

  • If so, how does OpenGL guess the usage, since it hasn't been given a hint?

不是。您必须至少调用一次glBufferData才能初始化缓冲区对象。如果您不想实际上传数据(因为要使用glMapBuffer),则只需为数据指针传递一个null指针即可。这与glTexImage一样工作,在glTexImage中创建了一个缓冲区/纹理对象,并使用glBufferSubData / glTexSubImage填充该对象,或者在使用缓冲区对象的情况下,以及通过内存映射来填充该对象。

  • What are the advantages/disadvantages of glMapBuffer vs glBufferData? (I know they don't do exactly the same thing. But it seems that by getting a pointer with glMapBuffer and then writing to that address, you can do the same thing glBufferData does.)

glMapBuffer允许您从另一个线程异步写入缓冲区。对于某些实现,OpenGL驱动程序可能使您的进程直接访问GPU的DMA内存,甚至更好地访问GPU本身的内存。例如,在具有集成图形的SoC架构上。


否,这似乎无效。您必须调用glBufferData,因为否则OpenGL无法知道缓冲区的大小。

关于哪一个更快,我和整个互联网似乎都没有明确的答案。只需对其进行测试即可查看。