1. 程式人生 > >虛幻引擎學習之路:渲染模組之材質系統

虛幻引擎學習之路:渲染模組之材質系統

上週的Unreal 4引擎文章介紹了渲染模組的光照系統,在本篇文章中,我們繼續介紹渲染模組的另一重要部分:材質系統。

在此,特別感謝Unreal中國團隊對於本篇文章中Unreal引擎相關內容的稽核,並在我們學習其引擎的道路上提供的大力支援。

材質系統

材質描述了場景中物體與光照進行互動的過程,它是決定物體表面外觀的最重要部分之一。Unreal 4引擎的材質系統為開發者提供了豐富的功能,使得開發者能夠非常便捷地設計出具有真實感的場景和角色。本文將在接下來的內容中對Unreal 4引擎的材質系統功能進行逐一介紹,其中主要分為四個部分:材質編輯、材質模型、材質使用和特殊功能。在介紹前三部分內容時,本文會根據需要與Unity引擎功能的相似性進行比較。

一、材質編輯

在Unreal 4引擎中建立材質可以通過“Content Browser”中的“Add New”按鈕或者右鍵彈出選單中選擇Material建立,如下圖所示:

然後,雙擊“Content Browser”中的材質資源,即可開啟材質編輯器。

傳統引擎的材質系統對於材質編輯的支援都是需要開發工程師和美術設計師合作完成。通常情況下,技術美術(Technical Artist)或圖形程式工程師編寫和修改Shader程式碼,然後美術設計師提供輸入紋理以及除錯Shader引數。Unreal 4引擎則提供了一套更為方便的編輯方式,使得美術能夠幾乎不依賴於程式設計師製作出較為理想的材質資源。

這種編輯方式類是一種似於Blueprint的節點圖。在編輯材質時,只需要用引擎提供的節點和連線即可製作出邏輯較為複雜的材質效果,如下圖所示:

請輸入圖片描述
上圖取自Unreal 4官方網站

其中,上圖左邊是材質編輯的預覽,右邊是材質節點圖。該節點圖中的節點在編輯完成後會被自動替換成HLSL程式碼段,並生成相應的Shader程式碼在實時渲染時使用。在除錯過程中,編輯完節點圖並儲存後,即可在場景檢視中看到最新的結果。

Unity引擎原生僅支援通過修改Shader程式碼的方式製作新的材質。但在Unity引擎Asset Store中有第三方外掛Shader Forge提供了類似的編輯功能【1】,如下圖所示:

請輸入圖片描述
上圖取自Unity Asset Store 【1】

此外,在Unreal 4引擎中的材質編輯介面的“HLSL Code”頁面中可以檢視由節點圖生成的程式碼,如下圖所示:

請輸入圖片描述

在“Stats”頁面中可以看到當前Shader的Instruction和Texture Sampler的數目,如下圖所示。這是一個直觀簡單、但卻很實用的功能。Unity引擎暫時還未原生支援該功能,研發團隊需要使用第三方工具來自行進行計算。

請輸入圖片描述

除了使用節點圖進行材質編輯,Unreal 4引擎也支援直接採用HLSL程式碼進行編輯。其詳細內容可參考Unreal 4官方網站。

材質編輯Unreal 4 vs Unity小結

  • 相比較而言,Unreal 4引擎原生提供了非常方便的節點圖互動方式,Unity引擎通過第三方工具也可以達到類似的效果

二、材質模型

與Unity引擎5.x的Standard Shader類似,Unreal 4引擎的材質系統使用了當前遊戲渲染中非常流行基於物理的渲染材質(Physically Based Rendering,以下簡稱PBR)模型。因此,它們都只需要少量的輸入引數,就能表達豐富的材質外觀,如下圖所示:

請輸入圖片描述

其中,左圖是Unreal 4引擎的材質系統節點圖中的基礎節點,其白色圓圈表示的引腳表示可設定的輸入引數,通過設定不同的輸入引數可以達到不同的材質效果。右圖是Unity 5.x的Standard Shader材質設定介面。兩者大部分引數表示含義是相似的,可通過以下各引數的對應關係來進行理解(Unreal 4 Unity):
  • Base Color Albedo:材質顏色、貼圖
  • Metallic Metallic:金屬度
  • Roughness Smoothness:粗糙、光滑度
  • Emissive Color Emission:自發光顏色、貼圖
  • Normal Normal Map:法線貼圖
  • World Position Offset Height Map:高度圖
  • Ambient Occlusion Occlusion:AO貼圖

上圖顯示了Unreal 4引擎與Unity引擎中不透明物體渲染的Shader引數設定。對於半透明渲染和Alpha Test渲染Unreal 4引擎和Unity引擎也都支援,並且可以通過修改引數選項進行設定,如下圖所示:

請輸入圖片描述

其中,左圖顯示了Unreal 4引擎材質編輯器中“Blend Mode”設定選項,右圖顯示了Unity引擎“Rendering Mode”設定選項。其對應關係為(Unreal 4 Unity):
  • Opaque Opaque:不透明渲染
  • Masked Cutout:Alpha Test
  • Translucent Transparent:半透明渲染

Unity引擎中的Fade模式是用於渲染模型逐漸消失的效果。Unreal 4引擎另外三種“Blend Mode”的含義如下,通過這三種引數開發團隊可以達到更為靈活的半透明效果。

  • Additive:將Pixel的結果疊加到背景
  • Modulate:將Pixel的結果乘以背景
  • AlphaComposite:預乘Alpha值Blend

Unreal 4引擎材質編輯器的基礎節點中有許多“預設”輸入引數,對不同的“Blend Mode”,其可供設定的引數也不相同,如下圖所示:

請輸入圖片描述

其中,從左到右分別是:不透明、半透明以及Alpha Test的材質輸入引數。對於無效的輸入引數,Unreal 4引擎將其變成灰色,並且無法連線節點圖。

Unreal 4引擎除了提供“常規”PBR的材質模型,還提供了一些用於製作特殊效果的材質模型。在我們來看,這些更像是Unreal引擎為開發者製作了一些快捷開發的材質模板。在材質編輯器中可以通過設定“Shading Model”進行選擇,如下圖所示:

其中,“Default Lit”表示預設的PBR材質模型。對於不同的材質模型,基礎節點提供的輸入引數也不相同。關於不同材質模型的輸入引數和效果,本文不逐一介紹,讀者有興趣可參考Unreal 4官方網站。文字選擇了幾種我們認為效果特殊的材質模型進行介紹。

- Subsurface、Preintegrated Skin、Subsurface Profile這三種材質模型的渲染效果比較相似,都屬於次表面散射類。與Subsurface有所不同的是,Preintegrated Skin和Subsurface Profile都是專用於模擬人體面板渲染效果的模型。但是,Preintegrated Skin使用的方法更加高效並適合於低端裝置,而Subsurface Profile的渲染效果更好適合高階裝置。其效果如下圖所示:

請輸入圖片描述
Subsurface
請輸入圖片描述
Preintegrated Skin
請輸入圖片描述
Subsurface Profile
上圖取自Unreal 4官方網站

其中,上圖從上到下分別是Subsurface、Preintegrated Skin以及Subsurface Profile的渲染效果。Subsurface效果渲染需要比較高的硬體資源,在Mobile端目前還不支援。

- Clear Coat 這種材質模型用於渲染不透明物體表面覆蓋一層半透明的效果,如下圖所示:

請輸入圖片描述
上圖取自Unreal 4官方網站

其中,左圖是Unreal 4引擎渲染結果,右圖是實際拍攝結果。可以看出,該材質的渲染效果相當驚豔!

- Two Sided Foliage 這種材質模型用於渲染樹木材質效果,它比Default模型能更好地模擬樹葉的透射效果,如下圖所示:

請輸入圖片描述
上圖取自Unreal 4官方網站

其中,上圖左邊是採用Two Sided Foliage模型渲染結果,右圖是Default模型渲染結果。

材質模型Unreal 4 vs Unity小結

  • 相比較而言,Unreal 4引擎和Unity引擎都提供了豐富的、通用的基於物理的材質模型。Unreal 4引擎原生對於特殊效果提供了更多的材質模型。Unity引擎則通過Asset Store提供了一些特殊效果材質【2】【3】

三、材質使用

Unreal 4引擎的材質在使用時與Unity引擎有所不同。在Unity引擎中,材質資源一旦被建立,就可以新增到各種渲染元件中進行渲染。同時,我們可以在執行時通過程式碼修改材質引數。但是,需要注意的是,當Shader中的某些功能沒有被用到時,Unity引擎會自動對其進行優化。經過優化過後的Shader則不再包含這部分的功能,即使在執行時重新設定材質引數也不會生效。對於這種情況,在Unity引擎中可以通過Graphics Setting中的Always Included Shaders或在Shader中設定 “multi_compile”來實現,即告訴Unity引擎不要在Shader Stripping時去掉一些後續執行時需要使用的Key words。

在Unreal 4引擎中,修改材質資源的節點圖以及引數不會立刻生效,需要點選右上角“Save”或者“Apply”,此時會引起材質重新編譯。因此,材質資源中的引數並不支援在編輯器中實時或執行時更改。Unreal 4引擎提供了另一種材質資源Instanced Material。該種資源繼承自材質資源,它擁有與其父類材質資源相同的節點圖,並且支援在編輯器中實時或執行時修改引數。

  • Instanced Material

該種資源的建立與材質建立類似,在“Content Browser”中即可建立。然後雙擊資源圖示即可開啟編輯器。在“Details”頁面中可以設定其繼承的材質資源。下圖顯示了Instanced Material資源的設定介面,Parent引數即為其父類材質資源:

請輸入圖片描述

在使用之前,還需要在父類材質資源中將需要修改的引數用節點圖中的“Parameter”型別節點表示,如下圖所示:

請輸入圖片描述

然後,即可在Instanced Material編輯器的“Details”頁面中看到,如下圖所示:

請輸入圖片描述

其中,上圖“Parameter Groups”中的“Color”和“Roughness”引數即為其父類材質資源中“Parameter”節點表示的引數。

該Instanced Material支援實時在編輯器中修改“Color”和“Roughness”引數,而不需要重新編譯材質。但是這種Instanced Material僅支援在編輯其中修改引數,其在Unreal 4引擎中被稱為Material Instance Constant

如果需要執行時修改,則需要通過藍圖或者程式碼動態建立Instanced Material,這種材質在Unreal 4引擎中被稱為“Material Instance Dynamic”。如果想在專案執行時,根據一些特殊情況調整材質引數(比如怪物/角色受擊後改變顏色、死亡時改變透明度等等),那麼就需要通過Material Instance Dynamic來實現這些效果。

材質使用Unreal 4 vs Unity小結

在Unreal 4中,Material主要分為三類:原始Material、Material Instance Constant和Material Instance Dynamic。與Unity中的材質系統比較,有以下三點非常值得注意:

  • Unreal 4中的Material類似於Unity中的Shader,其節點圖則可認為是Shader程式碼的定義;

  • Unreal 4中的Material Instance Constant類似於Unity中Material,它是Shader和輸入引數的集合. 只有匯出的 Parameters 可以進行修改,但僅限在 Editor 下修改,在執行時是不能動態修改引數的。所以一般場景物件(不用動態改材質)都是使用各種Material Instance Constant來進行渲染;

  • Unreal 4中的Material Instance Dynamic類似於Unity中的Material(Instance)。主要區別是,前者需要在Unreal 4中手動指出,後者是Unity在專案執行時,當修改Material引數時動態生成。

四、特殊功能

Unreal 4引擎不僅提供了通用的材質建立、編輯和使用功能,而且還提供了一些輔助的特殊功能。本文將對其中的三種進行詳細介紹。

  • Material Function

Unreal 4引擎的材質編輯器內建了豐富的功能性節點,使得開發者在編輯材質節點圖時能夠靈活地實現許多功能。但是,當編輯的節點圖到達一定複雜程度後,維護起來就變得非常困難。Unreal 4引擎提供了一種類似函式式的使用者自定義節點,Material Function。當某些功能在多種材質中共用時,可以採用Material Function將其封裝成一個節點進行重複利用,降低了維護難度。

Material Function是Unreal 4引擎材質系統中的一種資源,通過右鍵選單進行建立,雙擊即可開啟Material Function的編輯器。Material Function的編輯方式與Material類似,也是採用節點圖的方式,如下圖所示:

請輸入圖片描述
上圖取自Unreal 4官方網站

當Material Function建立好後,在“Details”設定介面中勾選“Expose to Library”即可在Material的編輯的“Palette”中找到該節點,並可在節點圖中使用,如下圖所示:

請輸入圖片描述
請輸入圖片描述

使用方式與Unreal 4內建的節點相同,如下圖所示:

請輸入圖片描述
  • Layered Materials

在Unreal 4引擎中,Material Function實現了將某種通用功能封裝成一個節點重複利用。而利用Material Function的特點以及“Make Material Attributes”節點可以在一個材質資源中,將多種材質進行混合,如下圖所示:

請輸入圖片描述
上圖取自Unreal 4官方網站

其中,上圖是一個Material Function的節點圖,“Make Material Attributes”類似於材質資源中的基礎節點,它可以被認為是在Material Function內部完成了一種材質的定義。而在編輯材質資源時,通過將多個預先定義好材質的Material Function進行混合,就可達到Layered Materials混合效果。它可以被用於製作模型表面不同位置用不同材質渲染的情況,如下圖所示:

請輸入圖片描述
請輸入圖片描述
上圖取自Unreal 4官方網站

其中,角色模型用了5種不同的材質進行渲染。這幾種材質可以通過Layered Materials方式在一個模型上實現。

  • Material Parameter Collections

在編輯材質資源的過程中,通常會遇到某一個引數在不同的材質資源中使用的情況。此時,可以利用Unreal 4引擎提供的Material Parameter Collections資源進行管理。該種資源可以維護一系列變數和向量的引數值。這些引數可以在不同的材質中進行引用。當需要修改時,只需修改Material Parameter Collections資源中的共用引數值即可。在Unity中也有類似功能,即使用Shader的SetGlobal方法對全域性引數進行設定。

請輸入圖片描述

特殊功能Unreal 4 vs Unity小結

  • 相比較而言,Unreal 4引擎提供了更多、更復雜特殊效果支援,使得美術在製作時能夠更靈活、便利地實現複雜的材質。

材質系統小結

與我們熟悉的Unity引擎一樣,Unreal 4引擎對當前流行的PBR材質模型同樣進行了深度的支援,且在材質編輯方面,Unreal 4原生提供了更為直觀方便的節點圖互動方式。而在功能和效果上,Unreal 4引擎提供了豐富的模板和Material Function功能,從而讓開發團隊可以高效地創作出驚豔的渲染效果。希望隨著移動硬體裝置的逐漸提升,這些驚豔的效果可以在更多的專案中得到體現。

參考文獻

以上即為我們對Unreal 4引擎就渲染模組的材質系統的講解,之後我們會將繼續分享渲染模組下的影象後處理等其他學習心得,歡迎大家的關注!我們希望本系列文章能讓更多的中國遊戲開發者瞭解和理解Unreal 4引擎的重要功能和所能達到的效果,也讓更多的中國遊戲開發者對Unreal引擎和Unity引擎融會貫通,提升技術儲備。

最後非常感謝您能閱讀到這裡,希望能對您的專案有所幫助,如對文中的內容有異議或者進一步的補充說明,歡迎在後臺給我們留言,謝謝!


相關推薦

【UE4 全域性光照明】虛幻引擎學習渲染模組全域性光照明 by UWA侑虎科技

◆◆◆◆◆ 全域性光照總結 Unreal 4引擎提供了完整的工具鏈來支援靜態和動態物體的全域性光照效果。在計算全域性光照時採用了Photon Mapping演算法,通過不同的引數設定可以達到不同質量的全域性光照效果。Unreal 4引擎提供了同一場景使用不同全域性光照設定的功能Light Scena

虛幻引擎學習渲染模組材質系統

上週的Unreal 4引擎文章介紹了渲染模組的光照系統,在本篇文章中,我們繼續介紹渲染模組的另一重要部分:材質系統。 在此,特別感謝Unreal中國團隊對於本篇文章中Unreal引擎相關內容的稽核,並在我們學習其引擎的道路上提供的大力支援。 材質系統 材質描述

編程MySql系列多表查詢

所有 連接 進行 查看 bsp 關鍵字 right emp 字段 多表連接查詢 #重點:外鏈接語法 SELECT 字段列表 FROM 表1 INNER|LEFT|RIGHT JOIN 表2 ON 表1.字段 = 表2.字段; 交叉連接:不適用任何匹配條

Java學習不走彎路,就是捷徑

下載地址 下載 何事 系統 也有 包括 軟件公司 項目管理師 應用 1.如何學習程序設計? Java是一種平臺,也是一種程序設計語言,如何學好程序設計不僅僅適用於Java,對C++等其他程序設計語言也一樣管用。有編程高手認為,JAVA也好C也好沒什麽分別,拿來就用。為什麽他

Python學習集合的使用

元素 int pda car ren 添加 brush 存在 對稱 集合關系測試: list_1=[1,4,5,7,3,6,7,9] list_1=set(list_1) #去重 list_2=set([2,6,0,66,22,8]) print(list_1,typ

Python學習文件操作

append 句柄 enc pre light logs utf highlight 追加內容 文件基本操作: 打開、讀取、追加、關閉 #data = open("yesterday",encoding="utf-8").read() #打開並讀取文件 f=open("y

Python學習文件操作增刪改查

打印 odin day 打開 aps 之前 編碼 數據 adl f = open("yesterday","r",encoding="utf-8") #print(f.read()) #for i in range(5): # print(f.readline())

Python學習裝飾器實現

fun python run top 學習 pytho sleep light time() import time def timer(func):#timer(test1) func=test1 def deco(): start_time

Python學習裝飾器實現終極版

index type after color return 結果 python turn 調用 網站實現驗證功能裝飾器: import time user,passwd=‘alex‘,‘abc123‘ def auth(func): def wrapper(*ar

Python學習生成器

學習 tar light 列表 print pytho highlight 範圍 for循環 列別生成式:使代碼更簡潔 >>> [i*2 for i in range(10)] [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

Python學習叠代器

提前 func for循環 當我 本質 惰性 lec brush gen 可直接作用於for循環的數據類型有以下幾種: 一類是集合數據類型,如list\tuple\dict\set\str等; 一類是generator,包括生成器和帶yield的generator func

Python學習內置函數

函數 utf capi dict lte python學習 func blog .cn print(all([0,15,3]))# all全部都是可叠代的元素時返回TRUE print(all([1,15,3])) print(any([1,15,3]))#any任意一個

Python學習time和datetime模塊

exists atime shuffle aaa 絕對路徑 ons 平臺 文件名 可能 轉自:http://blog.51cto.com/egon09/1840425 一:內建模塊 time和datetime(http://www.jb51.net/article/49

Python學習random模塊

和數 highlight body ima bubuko randint 之路 ren 分享 #隨機生成4位數字的驗證碼 # import random # # checkcode=‘‘ # # for i in range(4): # current=ran

學習Python變量

number rst 賦值 初中 每一個 ber 進行 內存 命名規則 變量 變量的概念基本上和初中代數的方程變量是一致的,只是在計算機程序中,變量不僅可以是數字,還可以是任意數據類型。 在 Python 中,每個變量 在使用前都必須賦值,變量 賦值以後 該變量 才會被

學習Python算術運算符

col python gpo 數學 inf 算術運算符 加減 學習 進行 算術運算符 和數學中的運算符的優先級一致,在 Python 中進行數學計算時,同樣也是: 先乘除後加減 同級運算符是 從左至右 計算 可以使用 () 調整計算的優先級 下面是總結的算術運算符

Python學習staticmethod classmethod property方法

屬性 -c name .html 學習 assm true urn 系列 參考鏈接:http://www.cnblogs.com/alex3714/articles/5213184.html 靜態方法   只是名義上歸類管理,實際上在靜態方法裏訪問不了類或實例中的任何屬性

Python學習socket簡單實例

acc 學習 綁定 span spa bind local int code 客戶端 1 #客戶端 2 import socket 3 4 client = socket.socket()#相當於聲明socket類型,同時生成socket連接對象 5 cli

Python學習守護線程

之路 學習之路 pos lose start 啟動 AD 技術分享 pre 守護線程:只起到守護主線程的作用,主線程退出守護線程也跟著退出。 1 import threading,time 2 3 def run(n): 4 print("task",

Python學習隊列及生產者消費者模型

open imp read 之路 while args put bsp tar 隊列: 先進先出 後進先出 VIP(優先級) import queue # q = queue.LifoQueue()#後進先出 # # q.put(1) # q.put(2) # q.p