OpenGL VBO仅在渲染时上传到GPU

时间:2012-01-22 16:54:58

标签: c opengl vbo

我的VBO仅在第一次使用时被发送到GPU,这会在第一次绘制一个对象/一组对象时导致小的冻结。

我尝试以这种方式加载数据:

glBufferData(GL_ARRAY_BUFFER, size, NULL, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, size, data);

这样

glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);

但结果是一样的。

如果我在glBufferData之后画一个三角形:

glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, NULL);

然后问题解决了,但我发现这个解决方案相当骇人听闻。

有更好的解决方案吗?

(我有一堆小的VBO,每个包含256个顶点)

2 个答案:

答案 0 :(得分:1)

嗯,这就是Buffer Objects应该如何工作,即添加一些异步操作。我们的想法是,您可以上传大量的缓冲区对象,然后继续执行OpenGL操作,只有pipline停止,如果访问的数据尚未完成上传。 glBufferData和glBufferSubData要么使指针的页面传递给它们CoW,要么制作临时副本,无论哪种方式都可以在调用返回后安全地丢弃进程中的数据,OpenGL客户端仍然会有(正在进行的)数据上传过程。

调用glFinish()将阻塞,直到操作pipline完全完成(因此名称)。

答案 1 :(得分:0)

在glBufferData调用之后尝试调用glFlush()。