2013-08-28 58 views
4

在我的代碼中,我有一個由兩個緩衝區對象和一個頂點數組對象支持的對象的包裝類。我生成它們的構造(略簡體)使用此:從非主線程加載的VAO上崩潰

glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 
glGenBuffers(1, &ibo); 
glGenBuffers(1, &vbo); 
printf("Ind buffers %d %d %d\n", vao, ibo, vbo); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 

的printf的給出了這樣的主線程上的前幾個作品。

Ind buffers 1 1 2 
Ind buffers 3 4 5 
Ind buffers 4 6 7 
Ind buffers 5 8 9 
Ind buffers 6 10 11 
Ind buffers 7 12 13 

在VAO#2和緩衝區#3之間有一個單獨的非索引之一。這對我來說很好。每個數組對象都有兩個連接到它的唯一緩衝區。

我稍後使用此代碼以及加載背景資源(而是生成它們)。每個線程都有自己的使用glfwCreateContext創建的上下文,並與主窗口共享資源。當第一次創建這些資源,這個輸出來了:

Ind buffers 1 14 15 
Ind buffers 1 16 17 
Ind buffers 1 18 19 
Ind buffers 1 20 24 
Ind buffers 1 21 23 
Ind buffers 1 22 25 
Ind buffers 1 26 27 
Ind buffers 1 28 29 
Ind buffers 2 30 31 
Ind buffers 2 32 33 
Ind buffers 2 34 35 
Ind buffers 2 36 37 
Ind buffers 2 39 40 
Ind buffers 2 38 41 
Ind buffers 2 42 43 
Ind buffers 2 44 45 

在此之後很快,VAO#1用於繪製使用不同的頂點和難免有段錯誤量9倍。

我的問題是,這是一個錯誤還是我做的事情明顯錯了?我正在使用Nvidia卡在運行戴爾筆記本電腦的Linux Ubuntu上進行測試。

回答

4

OpenGL規範明確禁止共享VAO對象。

但是VBOs仍然是共享的。你只需要在每個線程中使用輕量級的VAO。