2016-07-02 55 views
0

我正在研究一個需要多種材質的多個物體的遊戲場景。我在網上廣泛搜索,但我找不到任何滿意的解決方案。OpenGL正確實施多種材質

我的場景將會像一條河流流過,而且那裏的材質無論如何都需要單獨的着色器(它會將許多鏡面反射和法線貼圖合併成一條看起來像河流的地圖),那麼會有一個地形混合兩個草地和沙地紋理)需要另一個着色器。還有一個玩家的手和愛情和所有。

編輯:基本上我想找出製作最靈活的多種材質/着色器實現的最有效方法。

簡而言之,周圍有很多複雜的物體需要不同的着色器。他們的人數並不多,但卻有很多複雜性。

所以使用glUseProgram()很多時候dosn't似乎是最聰明的想法。也有很多着色器代碼可以像點光源計算一樣通用。製作通用着色器並使用if和狀態制服可能有效,但仍需要不同的着色器來處理河流,同樣也需要使用不同的材質。

我基本上不了解這樣一個通用系統的組織和實現。我已經使用了像Unreal或Blender這樣的引擎,它們使用基於節點的材料,並且允許定製每一種材料而沒有太多滯後。這樣的系統如何轉化爲基本的GPU代碼?

+1

要麼你的問題很廣泛,要麼只是不清楚。我不確定你在問什麼。 –

+0

我想你需要一個建立在opengl之上的遊戲引擎,是java所必需的? – niceman

+0

@NicolBolas問題:我如何有效地實現多個材質,否則需要單獨的着色器? – HuraToTheRescue

回答

1

如果你真的遇到時序問題因爲太多glUseProgram()電話,你可能想在shader subroutines看看,並使用較少,但更大的計劃。在此之前,只有在需要時纔對數據進行排序(例如,按着色器排序,然後按材料排序)。無論如何,我想這總是一個很好的做法。

老實說,我不認爲你的計時問題來自使用太多的程序。例如,您可能想要使用frustum culling(以避免將幾何圖形發送到將被剔除的GPU)和early z-culling(以避免將被覆蓋的片段的複雜光照計算)。您也可以將level of detail用於遠離複雜的幾何圖形,因此不需要太多細節。

+0

的確沒有別的辦法。我們必須組織着色器並採用適當的優化來獲得我們期望的性能。其全部關於質量和性能之間的平衡。 – HuraToTheRescue