Mango如何運作: 著色器的呼喚
— John Schlag
Mango可以透過兩種方式處理從未遇到過的著色器。您不但可以以自製的著色器搭配Mango使用,甚至可以直接加入Maya著色器裡面使用。
要以自製著色器搭配Mango使用,請參閱使用者手冊中的手動控制著色器 (Override Shaders) 的部分。這個功能可以提供一個使用寫在GSL檔中的Gelato著色器的方法暫時替代或同時使用Maya內建的著色器。
至於第二點 - 直接加入Maya著色器 - 這麼做有兩點好處。首先,Mango本身內建了許多與Maya著色器相對應的著色器,但是並不完全。您可以以手動的方式填滿缺少的著色器。 (如果您這麼做了,請告知我們。或許我們可以將新的著色器包含在下一版的Mango之中) 其次,您本人或是其他人可能會自己撰寫Maya著色器外掛。Mango當然不可能碰過這些外掛。要讓這些新的著色器在Gelato中正常運作,您可能需要搭配GSL或是DSO Shadeop使用。
要了解這些是如何運作的,首先得要清楚Mango處理著色器的方式。
Mango的部分設計理念就是要能夠處理內建的Maya著色器以及其他所有使用者想要寫入GSL的自製著色器。要達到這個目的,Mango必須有以下能力:
- 開啟任何著色器 .gso檔案 (不管是我們的還是您自製的)
- 取得著色器參數表
- 在Maya節點中找出相同的屬性
- 寫入不相連的屬性的值 (不論此值是否會變動)
- 最後找出跟「上流 (upstream)」貼圖之間的連結,對這些連結做同樣的行動。
當然,Mango也在參數編輯器 (Attribute Editor) 中針對自製著色器參數增加使用者介面物件。這項功能讓自製著色器看起來就跟內建著色器一模一樣。您可以沿用在Maya中慣用的方式來編輯參數、賦予動畫屬性並且加上貼圖。
既然Mango必須有能力針對自製著色器提供這些功能,那當然也可以使用同樣的程式碼去處理內建的著色器。這是一個重點:Mango外掛程式幾乎完全不了解Maya內建的著色器。或許聽起來奇怪,但事實就是如此:Mango的Maya模擬著色器是被寫在GSL之中的,其實處理內建著色器的方式就跟處理其他您所寫的自製著色器一模一樣。換句話說,您的自製著色器才是頭等公民。
一旦您寫好了一個新的著色器,並且正確地編譯入gslc裡面,請確定編譯後的 .gso檔放在著色器的搜尋路徑之中 (檢視Gelato Render Globals中的「string path:shader」參數),接著Mango就會找到著色器,並且以上述的方式處理。
要撰寫Maya模擬著色器 - 或是對應一個自製的Maya著色器外掛 - 只要確定著色器參數的名稱跟Maya著色器節點上的屬性名稱相符合就好了。
此外,還有一些小技巧。由於Gelato沒有能力處理所有Maya屬性,所以有些地方也可以藉由Mango來輔助。
- 當參數/屬性名稱因為內含GSL保留字樣而不能使用時,您都可以在該名稱之前加上一條底線 (_) 來表示。例如,最長使用的著色器參數名稱當然是「顏色 (color)」,所以GSL的參數名稱就會以「_color」 來取代。
- 訊息屬性以字串 (string) 的方式寫入,內含相連結的節點名稱。 (這是shadingSwitch節點運作原理的一部分)
- 在Gelato 2.1版中,GSL支援變動陣列 (variable-length arrays)。然而在之前的版本,以及某些複雜的複合屬性裡面,Mango依然支援將著色器參數繪入某些陣列元素:底線 (_) 變成句點 (.),「_n」 變成「 [n]」。例如, input_3_alpha 變成 input[3].alpha 。
- GSL中並沒結構 (Struct) 的存在,但是Maya的屬性裡有些卻是由Struct的陣列所構成。例如,tripleShadingSwitch的 input 屬性在GSL中可能會被寫成「struct { color inTriple; string inShape; } input[]」。但是著色器參數只是以簡單的 「color inTriple[]」以及 「string inShape[]」 來取代。 一旦Maya在陣列參數中找到相對應的Maya屬性,而該屬性又不是陣列的時候,Mango將會向上一層搜尋,檢查其母屬性是否為陣列。
- 某些著色器被分為兩個部分。儘管Gelato 2.1版以需求優先的順序來執行著色器,目前依然沒有明確的方式能夠將參數交給上流著色器處理。所以,例如,當撰寫使用maya_projection功能的著色器時,Mango會先找尋maya_projection_pre.gso,在交叉比對上流連結之前先撰寫一個取用這個.gso的著色器,最後才會去撰寫取用maya_projection.gso的著色器。基本上這個「pre」著色器會去計算在其他著色器中使用的貼圖座標。Mango很可能也會幫您的著色器撰寫一個「pre」著色器。
以上所有代表在使用Maya模擬著色器以及自製著色器的時候,您擁有非常大的主導權。您甚至可以在單一著色影像中混合使用這兩種著色器。事實上,只要是具有gelatoShader string 屬性的所有節點都可以手動控制,雖然只有表面著色器 - lambert、blinn、phong等 - 擁有使用者介面。 |