我有一个巨大的vbo,整个事情每一帧都会改变。
我听说过快速更改缓冲区数据的不同方法,但是对我的程序来说,其中只有一个看起来不错。但是我不理解它,也找不到任何代码示例。
我听说有人声称你应该用“null”作为数据调用glBufferData,然后用每帧填充真实数据。这是什么目的?这在代码中是什么样的?
答案 0 :(得分:6)
一切都在文档中。
https://www.opengl.org/sdk/docs/man/html/glBufferData.xhtml
如果您将NULL
传递给glBufferData()
,它看起来像这样:
int bufferSize = ...;
glBufferData(GL_ARRAY_BUFFER, bufferSize, NULL, GL_DYNAMIC_DRAW);
void *ptr = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
...
忽略大部分函数调用,唯一的两个重要部分是bufferSize
和NULL
。这告诉OpenGL缓冲区的大小为bufferSize
,内容未初始化/未定义。实际上,这意味着只要需要,OpenGL就可以继续使用缓冲区中的任何先前数据。例如,使用缓冲区的先前绘制调用可能尚未完成,并且使用glBufferData()
允许您为缓冲区获取 new 内存,而不是等待实现完成使用旧的记忆。
这是一项古老的技术,效果相当不错。还有其他几种常见技术。一种这样的技术是双缓冲,并且每帧在两个VBO之间切换。更复杂的技术是使用持久缓冲区映射,但这需要您自己管理内存栅栏才能使其正常工作。
请注意,如果您要使用glBufferData()
上传数据,那么事先使用glBufferData()
调用NULL
并不能实现任何目标。