我正在做一个渲染,每帧我多次调用glBufferSubData。
这是我在代码中的方法:
glBindBuffer(GL_ARRAY_BUFFER,_vboID);
//Buffering the data
glBufferData(GL_ARRAY_BUFFER,_vboDATA[type].size()*sizeof(vboData),nullptr,GL_DYNAMIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER,0,_vboDATA[type].size()*sizeof(vboData),_vboDATA[type].data());
glBindBuffer(GL_ARRAY_BUFFER,0);
我问是因为我有不同类型的元素,每个元素都有它自己的向量来表示vbo数据(即在程序中使用1个VBO(用于颜色,UV,位置-和1个VAO),我正在渲染像:
1.)将元素1的向量加载到缓冲区
2.)渲染元素1
3.)将元素2的向量加载到缓冲区
4.)渲染元素2
...
这样是正确的方法吗?
最佳答案
正确的方法取决于您的使用情况。当数据大部分为静态数据时,最好的方法是将数据一次上传到GPU。可以通过为每个对象创建一个VBO或将所有对象修补到一个VBO中来完成。
如果数据是完全动态的(并且每一帧都在变化),则无论如何都必须上传数据,因此仅使用一个缓冲区就可以了。但是您仍然应该尝试仅上传数据(glBufferSubData
)并避免全部分配新的内存(glBufferData
)。例如,您可以选择缓冲区的初始大小,该大小足以容纳所有数据。另一种选择是使用persistently mapped buffer。