2017-04-07 39 views
1

我正在閱讀Real-Time Rendering(第三版)。在第7.9節「組合燈光和材料」中,它說「如果不使用動態分支,則需要爲每種可能的燈光和材料類型組合生成不同的着色器」。爲什麼我們需要動態分支來渲染多個光源

我認爲靜態分支非常適合這個問題。是對的嗎?

回答

0

假設你的'引擎'代碼是確定你的場景中哪種燈光和材料,並且(通常)是動態的。爲了與您的着色器溝通,您需要以某種方式傳遞信息 - 通過制服,紋理或緩衝區。該數據不是靜態的,因此,基於其中包含的信息的任何條件表達式都是動態分支。

某些圖形API /驅動程序在底層進行了優化,基本上重新編譯了預測多個分支的着色器,並將其稱爲「靜態分支」。例如,對於D3D9着色器文檔,它指出:

靜態分支允許的着色器代碼塊爲開或關 基於布爾着色器常數切換。

在其他API(如OpenGL)中,雖然可能發生這種優化,但它在發生這種優化時並沒有很好地公佈。它也可能(將)不同於駕駛員。但是,自己編寫組合的方法要可靠得多,這樣你就知道使用了什麼類型的分支(沒有!)。

如果您的場景具有不變的燈光和材質,那麼您可以在着色器中對光線和材質類型進行「硬編碼」(比如常量)。然而,這實際上就是引用的內容 - 您可以使用靜態分支,但是需要爲每個燈光和材質組合生成不同的着色器。

+1

但在第3.2節「本書的可編程着色器階段」的末尾,它說基於制服值的分支實際上是靜態分支。我認爲這種分支不同於基於紋理數據等動態源值的分支。 – delphifirst

+0

我想你可能會爭辯說,如果你使用靜態分支,那麼驅動程序可能會爲引擎蓋下的每個組合產生不同的着色器,所以報價可能仍然是正確的。 – Columbo

+0

更新了一些關於靜態分支優化的答案。 – MuertoExcobito