2011-05-26 138 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