我有一个 OpenGL 程序,需要定期更新纹理。但同时我希望程序在更新这些纹理时能够做出响应(具体来说,继续运行绘制/显示代码)。
但这似乎不可能:如果我让线程 1 执行绘制/显示代码,线程 2 执行纹理移动,那么它们将在资源 GL_ARRAY_BUFFER_ARB 下发生冲突,因为线程 2 必须保留该资源才能将某些纹理移动到 vbo。我需要 GL_ARRAY_BUFFER_ARB 来为 thread1 执行绘制/显示代码,因为它使用不同的 vbo。例如这段代码
glBindBufferARB(GL_ARRAY_BUFFER_ARB, tVboId);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, numVertices*2*sizeof(GLfloat), texCoords, GL_DYNAMIC_DRAW_ARB);
glBindBufferARB(GL_ARRAY_BUFFER_ARB,0);
将移动一些纹理,但这需要一段时间。在此期间,显示代码应该运行多次,但它会崩溃,因为 GL_ARRAY_BUFFER_ARB 正在使用中。
我以为我可以做类似 GL_ARRAY_BUFFER_ARB2 的事情,但我认为没有这样的事情。
最佳答案
使用 PBO,它们允许您进行异步传输,了解更多 here .
关于C++ OpenGL Multithreading 与缓冲区资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6145006/