2009-04-12 33 views
4

我想做一個顯示一些3d圖形和命令行的opengl應用程序。我想讓他們分開的線程,因爲他們都是沉重的過程。我認爲我可以用2個不同的視口來處理這個問題,但我想知道如何處理opengl中的線程。如何從不同線程繪製opengl圖形?

根據我一直在閱讀的內容,Opengl是異步的,並且從不同線程調用它的函數可能是非常有問題的。有沒有辦法可以用來解決這個問題?理想情況下,我想在3D圖形的頂部繪製命令行,並帶有一些透明效果......(這是我認爲不可能的視口)

解決方案是否便攜是非常重要的。

謝謝!

回答

4

它可能你可以實現你想要使用覆蓋。
疊加層有點過時的功能,但它應該仍然在大多數設置中支持。基本上,疊加層是一個單獨的GL上下文,它與另一個層在同一個窗口中繪製,並繪製在窗口上繪製的任何上下文中。
你可以閱讀關於它here

1

你不能用2個視口。

每個OpenGL上下文必須從創建它的同一個線程中使用。

可以安全地在兩個單獨的線程中設置和使用兩個獨立的窗口句柄,每個句柄都有自己的上下文,但不能在一個窗口中使用2個視口。


一個好地方,看看這個想法是OpenSceneGraph.它做了很多工作,與線程,以幫助儘量加快處理,並保持恆定,高幀率具有非常大的場面。

我已經成功嵌入它並使用它從2個獨立的線程,但OSG有很多檢查來幫助這種情況。

+0

然後,我將不得不看看OSG內部......我當然不想爲此功能嵌入整個庫...謝謝! – alvatar 2009-04-12 17:50:39

+0

大多數情況下,它只是確保您在線程上創建上下文,並將該線程用於每個到該窗口/上下文的OGL調用。只要你不使用來自不同線程的上下文調用任何OGL調用,你就沒問題。 – 2009-04-12 18:19:40

2

我認爲,不要試圖創建兩個線程來繪製到屏幕上,您需要使用MVC pattern並使您的模型線程安全。然後,您可以有一個線程從模型的每幀中獲取必要的信息並將其投射到屏幕上,然後再將其他兩個線程(一個用於圖形,另一個用於命令行)只管理模型。

因此,例如,您有一個具有3D圖形內容的Simulation類,然後是具有命令行的CommandLine類。這些類中的每一個都根本不使用OpenGL;只管理數據,例如在三維空間中的事物,以及在命令行的情況下在屏幕上顯示隊列。然後,opengl線程可以在每一幀中查詢這些類的線程安全函數,以獲取必要的信息。例如,它抓取三維物體的位置,在屏幕上繪製它們,然後抓住線條顯示在命令行上並繪製它們。