OpenGL 2.1:glMapBuffer和用法提示

时间:2012-01-13 22:46:41

标签: opengl vbo

我一直在使用glBufferData,我必须指定使用提示(例如GL_DYNAMIC_DRAW)。

但是,我最近suggested to me on Stack Overflow使用glMapBufferglMapBufferRange修改了非连续的顶点数据块。

使用glMapBuffer时,似乎没有任何指定用法提示的点。所以,我的问题如下:

  • 如果您从未在该VBO上调用glMapBuffer,则对给定的VBO使用glBufferData是否有效?
  • 如果是这样,OpenGL如何猜测用法,因为它没有给出提示?
  • glMapBuffer vs glBufferData有哪些优缺点? (我知道他们并没有做同样的事情。但似乎通过使用glMapBuffer获取指针然后写入该地址,你可以做同样的事情glBufferData。)

2 个答案:

答案 0 :(得分:18)

  
      
  • 如果你从未在VBO上调用过glBufferData,那么在给定的VBO上使用glMapBuffer是否有效?
  •   

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

  
      
  • 如果是这样,OpenGL如何猜测用法,因为它没有给出提示?
  •   

没有。您必须至少调用一次glBufferData来初始化缓冲区对象。如果您不想实际上传数据(因为您将使用glMapBuffer),只需为数据指针传递一个空指针。这与glTexImage类似,其中创建缓冲区/纹理对象,用glBufferSubData / glTexSubImage填充,或者在缓冲区对象的情况下以及通过内存映射填充。

  
      
  • glMapBuffer与glBufferData有什么优缺点? (我知道他们并没有做同样的事情。但似乎通过使用glMapBuffer获取指针然后写入该地址,你可以做同样的事情glBufferData。)
  •   

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

答案 1 :(得分:1)

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

至于哪个更快,我和整个互联网似乎都不知道答案。试试吧,看看。