2011-05-26 111 views
2

我有一个OpenGL程序,需要定期更新纹理。但同时我希望程序能够响应(特别是继续运行绘制/显示代码),同时更新这些纹理。C++ OpenGL多线程缓冲区资源

但是这似乎是不可能的:如果我让thread1对移动的纹理执行绘制/显示代码和thread2,那么它们将在资源GL_ARRAY_BUFFER_ARB下发生冲突,因为thread2必须保留该资源以将某些纹理移动到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的事情,但我认为没有这样的事情。

回答

3

使用PBOs它们允许您执行异步传输,请阅读更多here