我正在做一个渲染,每帧我多次调用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

08-16 04:02