glBufferData设置为null以便不断更改vbo

J.D*_*Doe 1 opengl opengl-es

我有一个巨大的vbo,整个事情每一帧都在改变.

我听说过快速更改缓冲区数据的不同方法,但其中只有一个对我的程序来说是一个好主意.但是,我不理解它,无法找到任何代码示例.

我听说有人声称你应该用"null"作为数据调用glBufferData,然后用每帧填充真实数据.这是什么目的?这在代码中是什么样的?

Die*_*Epp 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);
...
Run Code Online (Sandbox Code Playgroud)

忽略大部分函数调用,唯一的两个重要部分是bufferSizeNULL.这告诉OpenGL缓冲区的大小bufferSize和内容是未初始化/未定义的.实际上,这意味着只要需要,OpenGL就可以继续使用缓冲区中的任何先前数据.例如,使用缓冲区的先前绘制调用可能还没有完成,并且using glBufferData()允许您为缓冲区获取的内存,而不是等待实现完成使用旧的内存.

这是一项古老的技术,效果相当不错.还有其他几种常见技术.一种这样的技术是双缓冲,并且每帧在两个VBO之间切换.更复杂的技术是使用持久缓冲区映射,但这需要您自己管理内存栅栏才能使其正常工作.

请注意,如果您仍在上传数据glBufferData(),那么glBufferData()事先调用NULL并不会实际完成任何操作.