2

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

  1. 首先,当您使用 NULL 指针调用 glBufferData 时,是否分配了新内存,因此缓冲区大小是否发生变化是否重要?
  2. 其次,您是否需要在每次更新缓冲区时调用 glMap/glUnmap 或单个 glMap 工作?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);
    
4

1 回答 1

1

首先,当您使用 NULL 指针调用 glBufferData 时,是否分配了新内存

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

因此,如果缓冲区的大小发生变化,这有关系吗?

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

其次,您是否需要在每次更新缓冲区时调用 glMap/glUnmap 或单个 glMap 工作?

鉴于您的代码,您根本不应该费心映射它。映射用于将数据直接生成到缓冲区的内存中(或映射指针的来源)。您正在将数据生成到自己的内存中并只是复制它。因此,您最好使用glBufferSubData.

GL_INVALIDATE_BUFFER 是否与仅将数据设置为 NULL 相同?

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

于 2017-12-30T17:57:01.617 回答