OpenGL多執行緒

2021-07-22 02:22:24 字數 1316 閱讀 1015

在opengl裡面使用多執行緒載入紋理是很美好的構想。

網上討論這個的並不多。中文部落格裡

其基本思路如下:

要建立新的rendering context (rc), 先需要device context(dc).

dc可以在得到hwnd後得到:

hdc hdc = getdc(hwnd);

接下來使用windows extension函式:wglcreatecontext建立rc。如果失敗返回null。

在這裡我們用1個hdc建立2個rc:

hglrc rendcontext1 =wglcreatecontext(hdc); 

hglrc rendcontext2 = wglcreatecontext(hdc);

接下來我們用1個rc載入,乙個用來渲染。困難的是你必須共享2個rc之間的資源。

因為你在乙個rc中建立的紋理在另外乙個rc中是不可訪問的,反之亦然。

使用這個方法共享rc:

wglsharelists(rendcontext2, rendcontext1);
最好在呼叫context任何操作前完成這個操作!最好在與opengl做任何互動前呼叫。

renderingthread() 

loadingthread()

再次注意,wglsharelists 只能在程序內工作。所以使用多執行緒而不是多程序。

wglmakecurrent只是設定本執行緒的預設rc。所以並不關心其他執行緒在幹什麼。

現在你可以在load執行緒裡放心的呼叫載入,如glgentextures、gltexparameteri、glteximage2d了。

而render執行緒也可以訪問load執行緒的資源。

如果你想在render執行緒裡也載入,記住某些庫( devil)不支援多執行緒載入。自己去做執行緒互斥把。

我沒有嘗試多執行緒渲染。但從網上資料來看,即使有也沒有意義。 openglz的contexts切換會帶來大量額外負擔。

在程序的最後要釋放並刪除contexts。

wglmakecurrent(null, null).
以上是作者的基本思路。

在我的專案裡,我嘗試用乙個執行緒專門用於動態載入紋理。

看上去執行的不錯。不幸的是,當紋理載入頻率教高的時候,紋理會出現白框和閃爍。

在ati的某些顯示卡上效果會好很多,基本看不到奇怪現象;在nv的顯示卡上相當明顯。

這個問題尚沒有完美解決。基本只能在多執行緒裡將紋理讀到記憶體,然後在主渲染執行緒裡讀入視訊記憶體。

OpenGL總結12 OpenGL與多執行緒

因為處理三維紋理時間過長想要使用進度條來提高體驗,使用進度條時用的是qt的progressbar結合qtimer做的,這個時候需要opengl的資料處理在後台,前台顯示進度條。這裡要用到多執行緒,我原本將opengl相關的處理寫到乙個類裡,寫執行緒的時候直接針對類物件進行,但是資料的顯示始終不正確,...

Opengl多執行緒終究是浮雲

在opengl裡面使用多執行緒載入紋理是很美好的構想。網上討論這個的並不多。中文部落格裡 其基本思路如下 要建立新的rendering context rc 先需要device context dc dc可以在得到hwnd後得到 hdc hdc getdc hwnd 接下來使用windows ext...

多執行緒 多執行緒原理

我們首先要知道什麼是多執行緒,說白了就是多個執行緒,執行緒是什麼呢,其實就是程序執行的途徑,那麼說道這裡我們又引入了乙個新的名字,就是程序,那麼我們來看看什麼是程序,其實我們自己也能看到,啟動電腦的任務管理器,我們就可以看到程序選項,裡面是我們電腦所有的程序,我們會發現有很多的程序.簡單地說就是程序...