我的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,每个vbo包含256个顶点)
最佳答案
好吧,这就是缓冲区对象的工作方式,即添加一些异步操作。这个想法是,你可以上传大量的缓冲区对象,然后继续OpenGL操作,只有当数据被访问而上传还没有完成时,pipline才会暂停。glBufferData和glBufferSubData要么使传递给它们的指针页成为CoW,要么创建一个临时副本,这样在调用返回后,您就可以安全地丢弃进程中的数据,OpenGL客户端仍将有用于(正在进行的)上载进程的数据。
调用glFinish()将阻塞,直到操作pipline完全完成(因此命名)。
关于c - 渲染时仅将OpenGL VBO上传到GPU,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8962781/