天天看點

【UE4從零開始 069】分層材質

【UE4從零開始 069】分層材質

可以将分層材質想像成“材質内的材質”。它們提供了一種方法來建立單個具有一系列子材質(即 層)的材質,這些子材質可以使用按像素的操作(例如蒙版)放在對象表面上。它們适合于處理獨特表面類型之間的複雜混合。在上面的火箭圖中,最右邊的火箭使用了單獨的材質層,包括鉻合金、鋁和銅,并且按像素在各材質之間進行混合。此效果可通過分層材質輕松實作。

作為一項功能,分層材質是作為材質函數的擴充而存在。函數是獨立的節點網絡,用于執行特定的運算,例如複雜的數學方程式。這些函數可在任意數目的材質中随意重複使用。在 Make Material Attributes(建立材質屬性) 和 Break Material Attributes(中斷材質屬性) 節點的幫助下,函數也可用來定義材質(完全在函數 之内 進行定義)。然後,通過将這些函數引入到最終的材質中,便可建立分層材質。

【UE4從零開始 069】分層材質

在上圖中,我們已認證 Make Material Attributes(建立材質屬性) 節點建立簡單的鉻合金材質(完全在材質函數内建立)。現在,此函數可用作 材質層,并可以與其他材質層混合。

因為材質函數無法直接應用于表面,需要将材質層函數引入到可以應用于對象的新材質中,認識到這一點十分重要。這樣做的好處是,可引入任意數目的材質層,以合适的方式對其進行混合。

是以,在較進階别,工作流程如下所示:

  • 建立新材質,并将其調整為達至完美。
  • 在内容浏覽器中,建立新材質函數,并将所有材質函數節點複制/粘貼到其中。
  • 将網絡連接配接到新的 Make Material Attributes(建立材質屬性) 節點,并将其連接配接到 Function(函數) 輸出。
  • 儲存該函數。
  • 将該函數從内容浏覽器拖放到材質編輯器中。現在,它變為材質層。
  • 使用材質層混合函數将多個材質層混合到一起。

現在,最終的對象在其表面上可以有多個明顯混合的材質層。

重要的益處

使用分層材質的好處之一是,可以建立不複雜的材質進行組合,并就将來可編輯而言使其更容易管理。例如,可以使用普通的不分層材質來建立分層材質效果,但這需要使用複雜的網絡在 每個材質輸入 的不同紋理和值之間進行混合。因為大部分材質使用多個輸入,此類材質的複雜性會大大提高。

【UE4從零開始 069】分層材質

請注意以下網絡的複雜性,此網絡未使用材質層,并将鉻合金效果與銅效果混合到一起,例如産生上圖所示的效果:

沒有材質層
【UE4從零開始 069】分層材質

但是,使用分層材質時,每種不同的材質類型都包含在自己的節點中,這使混合更加簡單,而美工進行編輯和調試也會更加容易。通過使用 Make Material Attributes(建立材質屬性) 和 Break Material Attributes(中斷材質屬性) 節點,所有的不同材質層可以直接連接配接,而不必關心如何連接配接各個屬性。

以下網絡的作用與上圖相同,但将鉻合金效果和銅效果子產品化到它們自己的材質層中:

使用材質層
【UE4從零開始 069】分層材質

材質層的另一個好處是,因為它們利用材質函數,是以可重複使用。這使得能夠設定材質原型庫,或設定用于定義基本的現實表面類型的材質。例如,可建立代表一般表面(例如鋁、鋼、皮革、塑膠、橡膠,等等)的層。然後,可使用分層材質在它們之間進行混合。這在希望建立細緻的對象(例如人物)時可能非常有用,這樣就不必建立一大批必須單獨應用于表面的材質。

【UE4從零開始 069】分層材質

混合類型

材質編輯器的材質函數清單包含各種材質層混合函數的清單。這些函數幫助執行混合,其中,不同的類型支援特殊類型的混合,例如能夠覆寫特定的材質特性。

【UE4從零開始 069】分層材質
材質層混合函數 說明
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(材質層混合_頂層法線) 對兩個材質的所有屬性進行混合,但僅使用頂層材質的法線紋理。

分層材質執行個體化

因為分層材質在本質上是材質函數,是以将其參數化以便執行個體化需要做一些額外的預先規劃。為了更好地使用标量和矢量參數,可建立函數輸入表達式作為材質層的組成部分。然後,可将頂層材質的一個參數連接配接到此輸入。

流程類似于:

【UE4從零開始 069】分層材質
  1. 材質參數(标量參數及矢量參數,等等)
  2. 材質層(函數)
  3. 函數輸入表達式
  4. 某個用于定義材質層的網絡
  5. 函數輸出
  6. 最終的材質

一些有用的提示:

  • 将材質表達式解析為函數以建立層時,請将所有參數替換為具有适當名稱的 FunctionInput(函數輸入)節點。
  • 當您将新的材質層引入到材質時,請将新的參數節點連接配接到輸入。
  • 現在,您可以将最終材質執行個體化,參數将驅動各個層的相應方面。
  • 務必提供函數輸入的預設值。這可加快不需要進行更改的使用者的工作流程。

警告

雖然分層材質非常适合于處理多材質設定,但使用這些材質時務必小心謹慎。它們可能會對性能産生嚴重影響,當各個層中使用的材質本身較為複雜時尤其如此。

請記住,所有的層将同時進行渲染,然後進行混合。例如,如果材質中有 4 個層,那麼對于對象的每個像素,系統必須進行測試以确定要對四個層中的哪一個進行混合,并拒絕任何不使用的層。增加的這種計算會導緻分層材質更加影響性能。

每當希望對象具有多種表面類型時,第一反應可能是使用分層材質。例如,對于汽車模型,可能想将一個材質層用于油漆,并對鋼材、橡膠和玻璃等等各使用一個材質層。但是,其中的許多材質可以在幾何級别分隔開。這将在對象上建立更多材質元素,這會增加繪圖調用,但通常效率更高。簡而言之,如果 可以 應用多個材質來代替使用分層材質,請這樣做。如果 必須 對材質的放置位置進行逐個像素的控制,請使用分層材質。

雖然将多個單獨材質壓縮為一個材質可減少繪圖調用,但是産生的分層材質通常要耗用大量系統資源,導緻無法用于移動裝置。

繼續閱讀