OpenGL 2.1:glMapBuffer 和使用提示

Posted

技术标签:

【中文标题】OpenGL 2.1:glMapBuffer 和使用提示【英文标题】:OpenGL 2.1: glMapBuffer and usage hints 【发布时间】:2012-01-13 22:46:41 【问题描述】:

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

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

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

如果您从未在某个 VBO 上调用过 glBufferData,那么在该 VBO 上使用 glMapBuffer 是否有效? 如果是这样,OpenGL 是如何猜测用法的,因为它没有给出提示? glMapBufferglBufferData 的优缺点是什么? (我知道他们做的事情并不完全相同。但似乎通过使用glMapBuffer 获取指针然后写入该地址,您可以做与glBufferData 相同的事情。)

【问题讨论】:

【参考方案1】:
如果您从未在给定 VBO 上调用 glBufferData,那么在给定 VBO 上使用 glMapBuffer 是否有效?

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

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

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

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

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

【讨论】:

【参考方案2】:

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

至于哪个更快,我和整个互联网似乎都没有明确的答案。测试一下看看。

【讨论】:

谢谢。所以 glMapBuffer 只用于修改已经使用 glBufferData 至少写入一次的数据? glBufferData 视为创建缓冲区对象的原因。你不必在那里写任何东西;您可以将 NULL 作为指针参数传递。但您需要先创建存储,然后才能映射它。

以上是关于OpenGL 2.1:glMapBuffer 和使用提示的主要内容,如果未能解决你的问题,请参考以下文章

glMapBuffer 不断返回 0x00000000

QOpenGLFunctions 缺少重要的 OpenGL 函数

OpenGL更新缓冲区如何影响速度

使用 OpenGL API 播放 BIK 视频

带有 glMapBuffer 的 Buffer 会被分配比 glBufferSubData 更慢的 VRAM 吗?

使用glMapBuffer的缓冲区是否会分配比glBufferSubData更慢的VRAM?