2011-05-12 59 views
14

我目前正在掌握OpenGL。我從GLUT開始,但決定「畢業」到SFML庫。 SFML實際上比GLUT提供更少的GL實用程序,但是可移植且提供了一些其他功能。所以這只是我,GL和GLU。是的,我是一個懲罰的騙子。管理OpenGL狀態機的策略

我想請教一下,人有管理的東西,如矩陣的變化,顏色變化,材質的變化等

目前,我從一個單獨的線程渲染下一個「裸對象」的設計理念策略。即。每個圖形對象都有一個可以完成繪圖工作的函數。這些對象本身可能是其他對象的集合,也可能是圖形基元的集合。當一個特定的Render()被調用時,它沒有關於在它之前調用過什麼變換/材料變化的信息(當然是好事)。

隨着事態已經發展我有一定的策略,如使每一個功能的承諾,推動再彈出的矩陣,如果他們進行任何轉換解決。對於其他設置,我在調用glBegin()之前明確地設置了需要設置的任何內容,並且沒有理所當然。當一個渲染函數對不太常見的狀態變量進行一些更改時,問題就會出現,並且我開始考慮使用一些RAII來強制執行對作用域中所做的所有狀態更改的逆轉。使用OpenGL有時會提醒我很多彙編編程。我發現我實際上正在開發自己的openGL封裝器,所以我認爲很有必要了解其他人使用的策略,或者關於這些策略的想法和注意事項。學科。或者,也許是時候切換到像場景圖庫這樣的東西了?

更新:13/5/11

現在已經調查過與頂點/正常/彩色陣列和VBO的我已決定將所有實際openGL的通信到一個單獨的模塊渲染。渲染過程將包括從我的對象中獲取大量GL獨立空間/材質數據,然後以可解釋的格式將所有這些信息傳遞給openGL。這意味着所有原始數組處理和狀態操作將被合併到一個區域中。它增加了一個額外的間接,和一點點計算開銷的呈現過程,但它意味着我可以用一個單一的VBO /陣列爲我所有的數據,然後每幀傳送,一次就全部,一旦openGL的。

+0

這是一個很好的問題,你也可能對http://gamedev.stackexchange.com/感興趣。至於你的問題,它超越了我,但是讓我想回到遊戲編碼。祝你好運 – 2011-05-12 04:11:08

回答

7

所以,它真的只是我,GL和GLU

我什麼也看不到的那麼糟糕。如果可能的話,我甚至會擺脫GLU。

對於其它設置,我明確地設置 任何需要 之前調用在glBegin設置()和掉以輕心 。

此外,這是一個很好的策略,但當然,你應該保持昂貴的狀態轉換到最低限度。而不是直接模式(在glBegin/glEnd),則應該遷移到使用頂點數組,如果可用的頂點緩衝對象。

問題蠕變,當一個渲染 功能做了一些變更,以較少 常見的狀態變量,我 開始考慮使用一些RAII 執行的一個範圍內的所有狀態 變化的逆轉。

的OpenGL的老版本提供您的屬性與訪問功能glPushAttrib/glPopAttribglPushClientAttrib/glPopClientAttrib客戶端的狀態疊加。但是,舊版OpenGL版本的巨大狀態空間是減少OpenGL-3的主要原因之一;現在許多固定功能流水線狀態所涵蓋的內容都是通過着色器配置和訪問的,其中每個着色器封裝了幾十個OpenGL狀態變量值。

使用OpenGL有時會使我想起很多程序集編程的 。

這並不令人意外,因爲OpenGL的第一個化身是設計一些抽象機器(實現),在這個機器上OpenGL調用的是那種機器的操作代碼。

+0

感謝您對「glPushAttrib()」和「PopAttrib()」的建議。我認爲一些RAII與這些命令結合起來應該使狀態管理更容易一些。那麼困難將不會過頭。頂點數組和VBO幾乎是我的目標列表中的下一個。我可以問爲什麼你提到_「我甚至會擺脫GLU」_? – EdF 2011-05-12 16:00:14

+0

@EdF:簡單的事實是,GLU已經過時,不再積極維護。另外據我所知,GLU的實現都使用了即時模式,這意味着它不適用於OpenGL-3/4核心配置文件。 – datenwolf 2011-05-12 16:19:54

+0

@EdF:如果你打算通過RAII系統來做到這一點,我沒有理由通過gl {Push,Pop} [Client] Attrib來實現這一點。我會通過一個模板機制來實現它,所涉及的狀態是模板參數;在構造函數中查詢有問題的狀態,在析構函數中設置它;還允許狀態鏈接,以便調用一個單一的「redoset」迭代器再次設置所有狀態。 – datenwolf 2011-05-12 16:33:47

2

首先,儘量不要使用glBegin/glEnd調用新的開發。它們在OpenGL 3中被棄用,並且在OpenGL ES(iOS,WebOS,Android)中不起作用。相反,使用頂點數組和VBO來整合您的繪圖。其次,不要編寫自己的包裝,而要看看最近的一些開源代碼,看看它們是如何做的。例如,查看可視化庫(http://www.visualizationlibrary.com/jetcms/)。這是圍繞OpenGL的一個相當薄的包裝,所以值得一看。