我一直在使用glBufferData
,我必须指定使用提示(例如GL_DYNAMIC_DRAW)。
但是,我最近suggested to me on Stack Overflow使用glMapBuffer
或glMapBufferRange
修改了非连续的顶点数据块。
使用glMapBuffer
时,似乎没有任何指定用法提示的点。所以,我的问题如下:
glMapBuffer
,则对给定的VBO使用glBufferData
是否有效?glMapBuffer
vs glBufferData
有哪些优缺点? (我知道他们并没有做同样的事情。但似乎通过使用glMapBuffer
获取指针然后写入该地址,你可以做同样的事情glBufferData
。)答案 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无法知道缓冲区的大小。
至于哪个更快,我和整个互联网似乎都不知道答案。试试吧,看看。