可以将分層材質想像成“材質内的材質”。它們提供了一種方法來建立單個具有一系列子材質(即 層)的材質,這些子材質可以使用按像素的操作(例如蒙版)放在對象表面上。它們适合于處理獨特表面類型之間的複雜混合。在上面的火箭圖中,最右邊的火箭使用了單獨的材質層,包括鉻合金、鋁和銅,并且按像素在各材質之間進行混合。此效果可通過分層材質輕松實作。
作為一項功能,分層材質是作為材質函數的擴充而存在。函數是獨立的節點網絡,用于執行特定的運算,例如複雜的數學方程式。這些函數可在任意數目的材質中随意重複使用。在 Make Material Attributes(建立材質屬性) 和 Break Material Attributes(中斷材質屬性) 節點的幫助下,函數也可用來定義材質(完全在函數 之内 進行定義)。然後,通過将這些函數引入到最終的材質中,便可建立分層材質。
在上圖中,我們已認證 Make Material Attributes(建立材質屬性) 節點建立簡單的鉻合金材質(完全在材質函數内建立)。現在,此函數可用作 材質層,并可以與其他材質層混合。
因為材質函數無法直接應用于表面,需要将材質層函數引入到可以應用于對象的新材質中,認識到這一點十分重要。這樣做的好處是,可引入任意數目的材質層,以合适的方式對其進行混合。
是以,在較進階别,工作流程如下所示:
- 建立新材質,并将其調整為達至完美。
- 在内容浏覽器中,建立新材質函數,并将所有材質函數節點複制/粘貼到其中。
- 将網絡連接配接到新的 Make Material Attributes(建立材質屬性) 節點,并将其連接配接到 Function(函數) 輸出。
- 儲存該函數。
- 将該函數從内容浏覽器拖放到材質編輯器中。現在,它變為材質層。
- 使用材質層混合函數将多個材質層混合到一起。
現在,最終的對象在其表面上可以有多個明顯混合的材質層。
重要的益處
使用分層材質的好處之一是,可以建立不複雜的材質進行組合,并就将來可編輯而言使其更容易管理。例如,可以使用普通的不分層材質來建立分層材質效果,但這需要使用複雜的網絡在 每個材質輸入 的不同紋理和值之間進行混合。因為大部分材質使用多個輸入,此類材質的複雜性會大大提高。
請注意以下網絡的複雜性,此網絡未使用材質層,并将鉻合金效果與銅效果混合到一起,例如産生上圖所示的效果:
沒有材質層
但是,使用分層材質時,每種不同的材質類型都包含在自己的節點中,這使混合更加簡單,而美工進行編輯和調試也會更加容易。通過使用 Make Material Attributes(建立材質屬性) 和 Break Material Attributes(中斷材質屬性) 節點,所有的不同材質層可以直接連接配接,而不必關心如何連接配接各個屬性。
以下網絡的作用與上圖相同,但将鉻合金效果和銅效果子產品化到它們自己的材質層中:
使用材質層
材質層的另一個好處是,因為它們利用材質函數,是以可重複使用。這使得能夠設定材質原型庫,或設定用于定義基本的現實表面類型的材質。例如,可建立代表一般表面(例如鋁、鋼、皮革、塑膠、橡膠,等等)的層。然後,可使用分層材質在它們之間進行混合。這在希望建立細緻的對象(例如人物)時可能非常有用,這樣就不必建立一大批必須單獨應用于表面的材質。
混合類型
材質編輯器的材質函數清單包含各種材質層混合函數的清單。這些函數幫助執行混合,其中,不同的類型支援特殊類型的混合,例如能夠覆寫特定的材質特性。
材質層混合函數 | 說明 |
---|---|
MatLayerBlend_AO(材質層混合_AO) | 将環境光遮蔽 (AO) 貼圖混合到表面上,以消除反射。 |
MatLayerBlend_BaseColorOverride(材質層混合_底色覆寫) | 允許替換底色。 |
MatLayerBlend_BreakBaseColor(材質層混合_中斷底色) | 輸出所傳入的材質層中的底色。 |
MatLayerBlend_BreakNormal(材質層混合_中斷法線) | 輸出所傳入的材質層中的法線紋理。 |
MatLayerBlend_Decal(材質層混合_貼花) | 使用第二個 UV 通道,将貼花片混合到材質上。 |
MatLayerBlend_Decal_UV3(材質層混合_貼花_UV3) | 使用第三個 UV 通道,将貼花片混合到材質層上。 |
MatLayerBlend_Emissive(材質層混合_自發光) | 将自發光紋理混合到材質層上。 |
MatLayerBlend_GlobalNormal(材質層混合_全局法線) | 将法線紋理混合到材質層上。 |
MatLayerBlend_LightmassReplace(材質層混合_光照系統替換) | 替換光照系統中的底色,進而允許更改間接照明效果。 |
MatLayerBlend_ModulateRoughness(材質層混合_調制粗糙度) | 将材質層的粗糙度乘以傳入的紋理。這對于産生“油膩”外觀來說非常有用。 |
MatLayerBlend_NormalBlend(材質層混合_法線混合) | 将法線紋理混合到表面上,但通過蒙版紋理進行混合,進而支援控制法線紋理的出現位置。 |
MatLayerBlend_NormalFlatten(材質層混合_法線壓平) | 減弱法線貼圖的效果。 |
MatLayerBlend_RoughnessOverride(材質層混合_粗糙度覆寫) | 替換材質層的粗糙度紋理。 |
MatLayerBlend_Simple(材質層混合_簡單) | 針對 2 個材質層提供簡單的線性插值混合解決方案。不混合法線貼圖,而是保留基本材質的法線貼圖。 |
MatLayerBlend_Stain(材質層混合_斑點) | 将頂層材質作為斑點混合到基本材質上,這意味着僅使用頂層材質中的底色和粗糙度值。 |
MatLayerBlend_Standard(材質層混合_标準) | 混合兩個材質層的所有屬性。 |
MatLayerBlend_Tint(材質層混合_着色) | 允許通過輸入色調顔色以及用于控制色調位置的蒙版,對材質層進行着色。這對于進行部分顔色更改而言非常有用。 |
MatLayerBlend_TintAllChannels(材質層混合_所有通道着色) | 與 Tint(着色)類似,但也影響鏡面反射。這是一個非常特例的函數,您通常不需要使用此函數。 |
MatLayerBlend_TopNormal(材質層混合_頂層法線) | 對兩個材質的所有屬性進行混合,但僅使用頂層材質的法線紋理。 |
分層材質執行個體化
因為分層材質在本質上是材質函數,是以将其參數化以便執行個體化需要做一些額外的預先規劃。為了更好地使用标量和矢量參數,可建立函數輸入表達式作為材質層的組成部分。然後,可将頂層材質的一個參數連接配接到此輸入。
流程類似于:
- 材質參數(标量參數及矢量參數,等等)
- 材質層(函數)
- 函數輸入表達式
- 某個用于定義材質層的網絡
- 函數輸出
- 最終的材質
一些有用的提示:
- 将材質表達式解析為函數以建立層時,請将所有參數替換為具有适當名稱的 FunctionInput(函數輸入)節點。
- 當您将新的材質層引入到材質時,請将新的參數節點連接配接到輸入。
- 現在,您可以将最終材質執行個體化,參數将驅動各個層的相應方面。
- 務必提供函數輸入的預設值。這可加快不需要進行更改的使用者的工作流程。
警告
雖然分層材質非常适合于處理多材質設定,但使用這些材質時務必小心謹慎。它們可能會對性能産生嚴重影響,當各個層中使用的材質本身較為複雜時尤其如此。
請記住,所有的層将同時進行渲染,然後進行混合。例如,如果材質中有 4 個層,那麼對于對象的每個像素,系統必須進行測試以确定要對四個層中的哪一個進行混合,并拒絕任何不使用的層。增加的這種計算會導緻分層材質更加影響性能。
每當希望對象具有多種表面類型時,第一反應可能是使用分層材質。例如,對于汽車模型,可能想将一個材質層用于油漆,并對鋼材、橡膠和玻璃等等各使用一個材質層。但是,其中的許多材質可以在幾何級别分隔開。這将在對象上建立更多材質元素,這會增加繪圖調用,但通常效率更高。簡而言之,如果 可以 應用多個材質來代替使用分層材質,請這樣做。如果 必須 對材質的放置位置進行逐個像素的控制,請使用分層材質。
雖然将多個單獨材質壓縮為一個材質可減少繪圖調用,但是産生的分層材質通常要耗用大量系統資源,導緻無法用于移動裝置。