2013-03-17 79 views
0

在我的遊戲中有一個渲染模塊可以處理着色器,幀緩衝區和繪圖。現在我想分別封裝這三個任務的邏輯。我的想法是,我將渲染模塊分成三個模塊。我這樣做是爲了降低代碼複雜度並輕鬆實現實時着色器重新加載,但對於我的問題並不重要。用空着色器程序繪製是否有效?

繪圖模塊將創建空着色器對象glCreateProgram(),並將它們與源文件的路徑一起全局存儲。着色器模塊會檢查它們並通過加載源文件,編譯和鏈接來創建實際的着色器。

但是在這個概念中,可能會出現渲染模塊已經想要繪製但着色器模塊沒有創建實際着色器的情況。所以我的問題是,繪製一個空的着色器程序是否有效?在這種情況下,屏幕會變黑是完全可以接受的。創建着色器應該很快就緒,所以延遲可能不明顯。

用空的着色器程序繪製是否有效?我怎樣才能實現其他地方加載着色器的想法呢?

+1

這是如何「降低代碼複雜度」?你有3個獨立的系統獨立運作。如果你想實現實時着色器重新加載......那麼只需將引用粘貼到程序旁邊的着色器。這似乎是構建渲染系統的高度過度複雜的方式。 – 2013-03-17 14:34:17

回答

1

你如何定義「有效」和「空」?

如果程序對象的最後一個鏈接不成功(或者它沒有最後一個鏈接),那麼調用glUseProgram就是一個GL_INVALID_OPERATION錯誤。這也意味着glUseProgram將失敗,所以當前程序不會改變。因此,所有glUniform calls都將提及該計劃,而不是新計劃;如果該程序爲零,則會出現更多GL_INVALID_OPERATION錯誤。

如果沒有當前程序(即程序爲0),則嘗試渲染將產生未定義的行爲。

是未定義的行爲「有效」您的需求?如果您不打算向用戶顯示該幀(通過不調用交換緩衝區),那麼您渲染的內容將無關緊要。 OpenGL錯誤隊列中的所有錯誤是否對您有效?

+0

我嘗試回答你的問題。我的意思是由'glCreateProgram'返回的id沒有着色器。通過有效我的意思是行爲是由OpenGL定義的,並且沒有錯誤。我希望OpenGL能夠跳過渲染。我交換緩衝區每幀framen,有效着色器或不。 – danijar 2013-03-17 16:18:55

+0

@sharethis:你的「空」的定義是無關緊要的。程序不需要着色器附加到有用的;他們必須*鏈接*是有用的。是的,你需要附加着色器來鏈接,但它是*鏈接*這是重要的一步。事實上,一旦你將你的着色器連接到一個程序中,你應該將它們分開。 – 2013-03-17 17:33:30

+0

感謝您的澄清。如果相關着色器尚未鏈接,我將需要讓渲染模塊跳過繪製調用。或者,也許我應該嘗試一種不同的方法。順便說一下,我仍然對最小可鏈接程序的組成部分感興趣。你知道嗎? – danijar 2013-03-17 21:27:12

1

兩個相關線路的文檔中:

可着色器對象上執行的所有操作都是有效的着色器對象是否被附加到程序對象。在源代碼加載到着色器對象之前或在着色器對象編譯之前,允許將着色器對象附加到程序對象。

如果程序是零,那麼當前的渲染狀態指的是無效的程序對象和着色器執行的結果是不確定的。但是,這不是一個錯誤。 如果程序不包含GL_FRAGMENT_SHADER類型的着色器對象,則可執行文件將安裝在頂點以及可能的幾何處理器上,但片段着色器執行的結果將是未定義的。

所以看起來有可能這樣做,但在所有機器上可能得不到相同的結果。

+0

我可以在'glUseProgram'程序中附加未着色的着色器嗎?結果會是什麼? – danijar 2013-03-17 16:20:58

+0

嗯,它說這是允許的,glUseProgram的描述還指出,程序只有在鏈接時纔會被加載到硬件中。我很確定沒有任何事情會發生,你將具有與空程序對象相同的渲染。 – filmor 2013-03-17 22:08:12

+0

我嘗試過,但它產生OpenGL的erorrs。不管怎麼說,還是要謝謝你! – danijar 2013-03-18 09:23:22

相關問題