OpenGL VBO孤立实现

时间:2017-12-30 16:20:22

标签: c opengl vertex-buffer-objects

我目前正在处理一个sprite渲染器,其数据每次都会改变,所以我一直在寻找流式传输缓冲区对象的方法,我遇到了缓冲区孤儿......这让我有些困惑。

  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);
    

1 个答案:

答案 0 :(得分:1)

  

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

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

  

因此,如果缓冲区的大小发生变化,这是否重要?

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

  

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

鉴于您的代码,您根本不应该打扰它。映射是指您何时将数据直接生成到缓冲区的内存中(或映射指针来自哪里)。您将数据生成到您自己的内存中并只是复制它。因此,使用glBufferSubData可能会更好。

  

GL_INVALIDATE_BUFFER是否也只是将数据设置为NULL?

它保留了缓冲区的长度,因此无法按照上述方式意外更改长度。