OpenGL Context同時只能被一個線程擁有,而在創建OpenGL窗口時被主線程佔據了。
解決方法是用函數wglMakeCurrent( HDC hdc,HGLRC hglrc),該函數可以將OpenGL Context關聯到調用此函數的線程:在主線程里加上一句wglMakeCurrent(NULL,NULL),解除關聯,在子線程開始時用wglMakeCurrent(hdc,hglrc)使子線程取得Context就行了。
我是在一篇關於多線程的OpenGL的英文資料裏看到的,原文主要是解決同時用兩個線程操作OpenGL:一個渲染,一個創建顯示列表。
他用的方法是在渲染時渲染線程取得Context,結束後釋放,另一個線程再佔用……這樣循環。
我估計甚至可以用wglMakeCurrent進行切換,實現多個線程同時往一個窗口上作圖!當然不是完全同時,只是輪流佔用而已。不過這樣效率並不高
微軟的文檔講wglMakeCurrent時並沒有說清楚一些問題:
A thread用 wglCreateContext建立context;
B thread用wglMakeCurrent綁定context;
但是缺少了兩點說明,否則你看不到圖像更新(返回值都正常),或者wglMakeCurrent返回奇怪的錯誤:
1.創建context的A線程不能退出了,否則即使B線程綁定了,也得不到圖像更新;
2.有些顯卡(我試過Intel的顯卡)需要A線程線程解綁定wglMakeCurrent(0, 0),否則這個函數返回BUZY的錯誤;
還有,A線程創建的context事實上可以被多個線程輪番使用,但前提是每次使用之前需要wlgMakeCurrent綁定,使用之後應該wglMakeCurrent(0, 0)解出綁定。
opengl的API做的不好的就是:錯誤檢測機制做的不好,沒圖像了,但是很難從那個函數查出它的原因在哪裏?