關於opengl多線程渲染問題

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做的不好的就是:錯誤檢測機制做的不好,沒圖像了,但是很難從那個函數查出它的原因在哪裏?

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章