我正在經歷所有Rastertek DirectX tutorials,順便說一下,作者傾向於使用多個着色器來處理不同的事情。在後面的教程中,他甚至介紹了着色器管理器類。DirectX中的多種着色器與多種技術
基於一些其他來源,但我相信使用具有多種技術的單個着色器會更高效。教程中的多個着色器是爲了簡單起見,還是在某些情況下使用多個着色器會比單個大着色器更好?
我正在經歷所有Rastertek DirectX tutorials,順便說一下,作者傾向於使用多個着色器來處理不同的事情。在後面的教程中,他甚至介紹了着色器管理器類。DirectX中的多種着色器與多種技術
基於一些其他來源,但我相信使用具有多種技術的單個着色器會更高效。教程中的多個着色器是爲了簡單起見,還是在某些情況下使用多個着色器會比單個大着色器更好?
我猜他們在教程中使用它們是爲了簡單。
分組技術或單獨分組是一個設計決定。有多個着色器的場景是有益的,因爲您可以隨意組合它們。
從Windows 8中的DirectX 11起,D3DX Library已被棄用,因此您會發現它已更改。您可以在DirectX Tool Kit的源代碼中看到這樣一個示例:http://directxtk.codeplex.com/以及它們如何處理它們的效果。
通常情況下,你將在內存中使用不同的頂點着色器,像素着色器等。技術傾向於將它們合併爲一個,因此在編譯Shader文件時,對於該技術,將編譯特定的頂點和像素着色器。當選擇具有Y通道的X技術時,您的效果對象正在處理設備的頂點/像素着色器。
您可以手動執行此操作,例如,只編譯像素着色器並將其設置爲設備。
大部分答案是:這取決於。
效果框架給你一個很大的好處,你可以使用Pass-> Apply來設置你的整個管道,這可以使事情變得非常簡單,但如果使用不當,可能導致很慢的代碼,這可能是爲什麼microsoft決定棄用它,但是使用多個着色器你可以做得很糟糕甚至更糟糕,directxtk實際上是一個很好的例子(它只適用於手機開發)。
在大多數情況下,效果框架會招致一些額外的api調用,您可以避免使用單獨的着色器(我同意如果您繪製調用綁定可能很重要,但是您應該考慮優化該部分的剔除/實例技術)。使用單獨的着色器,你必須自己處理所有的狀態/常量緩衝區管理,如果你知道你在做什麼,可能會以更高效的方式進行處理。
我真正喜歡的fx框架是非常好的反射和語義的使用,在設計階段它可以非常有用(例如,如果你做float4x4 tP:PROJECTION,你的引擎可以自動綁定攝像頭投影到着色器)。
在編譯時在着色器階段之間進行佈局驗證對創作(fx框架)非常方便。
獨立着色器的一大優勢是您可以輕鬆地僅交換所需的各個階段,因此您可以節省大量排列,而無需觸摸管道的其餘部分。
加載多個fx文件永遠不是一個好主意。如果可以的話,結合你的fx文件,如果不需要在你的VInput結構中,可以使用全局變量。
通過這種方式,您可以獲得所需的效果並將其設置在您自己的Shader類中,以處理其餘的包括技術通過。
爲自己創建一個抽象ShaderClass和一個抽象ModelClass。
更準確地說,讓您的着色器在Graphics類中獨立於模型初始化。 如果使用您的texture.fx文件創建TextureShader類,則不需要初始化它的另一個實例; 寧願將TextureShader對象與相應的模型共享,然後 創建一個Renderer結構/類來保存着色器指針和(需要時)使用虛擬的(任何)模型指針。