OpenGL VBO 孤立实现

OpenGL VBO orphaning implementation

我目前正在研究一个精灵渲染器,它的数据每刻都在变化,所以我一直在寻找流式传输缓冲区对象的方法,我遇到了缓冲区孤立...这让我有点困惑。

  1. 首先,当您使用 NULL 指针调用 glBufferData 时,是否分配了新内存,因此缓冲区大小是否发生变化是否重要?
  2. 其次,您是否需要在每次更新缓冲区或单个glMap 工作时都调用glMap/glUnmap? GL_INVALIDATE_BUFFER 是否与将数据设置为 NULL 一样?
  3. 最后,我在下面的实现中遗漏了什么吗?

    每笔报价:

    glBindBuffer(GL_ARRAY_BUFFER, ssb->buffers[1]);
    glBufferData(GL_ARRAY_BUFFER, length, NULL, GL_STREAM_DRAW);
    void* buffer = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
    memcpy(buffer, data, length);
    glUnmapBuffer(GL_ARRAY_BUFFER);
    

Firstly, when you call glBufferData with a NULL pointer, is new memory allocated

可能吧。这取决于当前存储是否仍在 GPU 上使用以及 OpenGL 实现的优化程度。

and as such does it matter if the size of the buffer changes?

是的,由于上述原因。如果您要孤立它,请不要更改缓冲区的长度。

Secondly, do you need to call glMap/glUnmap every time you update the buffer or does a single glMap work?

鉴于您的代码,您根本不需要映射它。映射用于将数据直接生成到缓冲区的内存中(或映射指针来自的任何地方)。您正在将数据生成到您自己的内存中,然后只是复制它。所以你最好使用 glBufferSubData.

And does GL_INVALIDATE_BUFFER do the same than just setting data to NULL?

它保留了缓冲区的长度,因此您不可能根据上述意外更改长度。