c++ - 每帧多次调用 glBufferSubData

标签 c++ opengl rendering

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

我问是因为我有不同类型的元素,每个元素都有自己的 vector 来表示 vbo 数据(我在我的程序中使用 1 个 VBO(用于颜色、UV、位置 - 和 1 个 VAO),我我像这样进行渲染:

1.) 加载元素1的 vector 到缓冲区

2.) 渲染元素 1

3.) 加载元素2的 vector 到缓冲区

4.) 渲染元素 2

...

这样做合适吗?

最佳答案

正确的方法取决于您的使用场景。当数据大部分是静态的时候,那么最好的方式就是将数据一次上传到 GPU。这可以通过为每个对象创建一个 VBO 来完成,也可以通过将所有对象拼凑成一个 VBO 来完成。

如果数据是完全动态的(并且每一帧都在变化),那么您无论如何都必须上传数据,因此只使用一个缓冲区可能没问题。但是您仍然应该尝试只上传数据 (glBufferSubData),并避免从头到尾分配新内存 (glBufferData)。例如,您可以选择足以容纳所有数据的缓冲区初始大小。另一种选择是使用 persistently mapped buffer .

关于c++ - 每帧多次调用 glBufferSubData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40303446/

相关文章:

Java AttributedString,粗体和上标

c++ - 如何生成任意数量 vector 的元组组合

c++ - 需要包含运行任务时间的二维矩阵的最优解

c++ - 修改已编译的静态库

c++ - 类定义需要参数吗?

c++ - 是否可以在 directx dc/buffer 上使用 opengl 进行绘制?

c++ - Eclipse 没有看到 ".a"库

c++ - OpenGL 3.2 核心配置文件指南

android-studio - Android Studio 的渲染问题

opengl - Ogre3D、多显示器和鼠标光标