我目前正在处理一个sprite渲染器,其数据每次都会改变,所以我一直在寻找流式传输缓冲区对象的方法,我遇到了缓冲区孤儿......这让我有些困惑。
最后,我是否遗漏了以下实施中的任何内容?
每个嘀嗒声:
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);
答案 0 :(得分:1)
首先,当您使用NULL指针调用glBufferData时,是否已分配新内存
可能。这取决于当前存储是否仍然在GPU上使用以及OpenGL实现的优化程度。
因此,如果缓冲区的大小发生变化,这是否重要?
是的,由于上述原因。如果您要进行孤儿,请不要更改缓冲区的长度。
其次,每次更新缓冲区或单个glMap工作时,是否需要调用glMap / glUnmap?
鉴于您的代码,您根本不应该打扰它。映射是指您何时将数据直接生成到缓冲区的内存中(或映射指针来自哪里)。您将数据生成到您自己的内存中并只是复制它。因此,使用glBufferSubData
可能会更好。
GL_INVALIDATE_BUFFER是否也只是将数据设置为NULL?
它保留了缓冲区的长度,因此无法按照上述方式意外更改长度。