2014-02-08 147 views
0

好吧我有一個程序與多個線程(在運行時從DLL加載)。每個線程都有獨立的OpenGL渲染上下文。我想要做的是,從主線程中,能夠繪製每個opengl上下文的幀緩衝區,並在主窗口中選擇的位置繪製它們(如果這是有意義的)。我設置了多線程,因爲當單線程「運行時進程」(只是榮耀的函數)時,在加載資源(運行時進程,可以隨時創建和終止)時使得程序掛起。基本上,我希望能夠「哄騙」opengl將其繪製到隨機緩衝區中,取出該緩衝區並在主線程中將其轉化爲opengl紋理並將其繪製到需要的位置(位置也在運行時確定)可調整的)。我的問題是,有沒有辦法讓渲染上下文繪製到一些分配的內存,而不是在窗口中繪製它?還有什麼方法可以從該上下文中獲取幀緩衝區。如果是這樣,我只需調用「glTexImage2D」,並在「字節」參數中指向內存。不要擔心線程同步的,我已經得到了相當不錯的吧......OpenGL在一個窗口中的多個渲染上下文

回答

1

我的問題是,有沒有什麼辦法讓渲染上下文得出一些分配的內存,而不在一個窗口中繪製了嗎?

是的。那些離屏區域被稱爲幀緩衝區對象(FBO)。

還有什麼辦法從該上下文中獲取幀緩衝區。如果是這樣,我只需調用「glTexImage2D」,並在「字節」參數中指向內存。

實際上使用宗教組織可以直接渲染到紋理。然後,您可以使用紋理繪製到常規窗口。

我建議你不要使用多個OpenGL渲染線程。主要原因是,GPU是一個共享資源,並且有多個OpenGL上下文/線程同時訪問它會損害性能。依次執行效果圖。您可以爲此使用單個共享上下文。

多個OpenGL的上下文可以共享他們的數據對象(紋理,頂點緩衝對象,像素緩衝器的對象);用於此的確切API取決於操作系統。在Windows上,您使用wglShareLists進行連接。抽象狀態載體對象(FBO,VAO)不能被共享;作爲一個經驗法則,您可以上傳大容量數據,並在上下文之間共享。

+0

好的,我明白gpu是一個共享資源,但我更喜歡這樣做。因爲所有的繪圖都是二維的(該項目是一個GUI),我最先做的是有一個指向32位整數數組的指針,並從子線程直接繪製到該「緩衝區」,然後將其轉換爲紋理需要刷新屏幕的時間。即使使用50個200x200,幀率仍然超過750 fps。我只想要一個更簡單的方法來在這些線程中執行高級圖形。我不想分享上下文。非常感謝您的幫助! – user1433205

0

在大多數platform一個OGL上下文綁定到窗口或視圖。你可能做的下一個最好的做法是使這種窗口/視圖不可見。

但是,爲什麼你需要多個上下文呢?儘管只有一個線程可能同時處於活動狀態,但OpenGL(在現代卡片上)確實支持渲染離屏紋理,但如果您正在使用傳輸吞吐量的正確方法,則您並不需要在上下文中使用多個線程。

+1

OpenGL上下文沒有以任何方式綁定到特定的窗口。在任何時候都可以將上下文重新綁定到另一個窗口。 – datenwolf

+0

這應該是顯而易見的,我的意思是你不能同時綁定兩個上下文到同一個窗口。 –

+3

其實你可以,如果每個上下文綁定從一個不同的線程。 – datenwolf