我的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个顶点)
答案 0 :(得分:1)
嗯,这就是Buffer Objects应该如何工作,即添加一些异步操作。我们的想法是,您可以上传大量的缓冲区对象,然后继续执行OpenGL操作,只有pipline停止,如果访问的数据尚未完成上传。 glBufferData和glBufferSubData要么使指针的页面传递给它们CoW,要么制作临时副本,无论哪种方式都可以在调用返回后安全地丢弃进程中的数据,OpenGL客户端仍然会有(正在进行的)数据上传过程。
调用glFinish()将阻塞,直到操作pipline完全完成(因此名称)。
答案 1 :(得分:0)
在glBufferData调用之后尝试调用glFlush()。