1. 程式人生 > >【材質編輯器全解第一卷】Unity,UnrealEngine4等各大引擎材質編輯器原理詳解

【材質編輯器全解第一卷】Unity,UnrealEngine4等各大引擎材質編輯器原理詳解

    現在是2018年,材質編輯器現在在各大引擎,3D軟體都非常普遍。那麼它們是如何工作的呢。    其本質是,一個視覺化節點就包含一段HLSL或者cg或者OpenGL程式碼,通過我們的“連線”將HLSL程式碼拼接出來。最後會出一張shader檔案。對於早期的Unity和大部分3D軟體的節點化材質編輯器來說,它們的shader程式碼比較簡單,總共shader程式碼加起來可能也不會超過2千行,對於這一類的材質編輯器來說,它們的會將視覺化的節點的shader程式碼直接填充到vertexshader或者fragmentshader中。還有一類比較複雜的,比如虛幻4的材質編輯器,這些視覺化節點所生成的只是一堆函式而已。下面就以虛幻4的材質編輯器為例,來詳細研究虛幻4的材質編輯器是如何工作的。虛幻的材質編輯器會最後生成一個HLSLCode檔案,可以在window->HLSLCode面板中檢視到。其實這裡面儲存的是一頓函式。當我們點選Compile之後,引擎會依次呼叫每個節點的Compile函式這個Compile函式會呼叫HLSLMaterialTranslatorCompiler->CustomExpression(this, CompiledInputs);HLSLMaterialTranslator會執行將節點的字串壓入上面的那個materialHLSLCode裡面(引擎的材質編輯器開啟的那個shader程式碼檔案)。大概的過程是這樣的。那麼下面就來研究一下,到底是如何將字串壓入HLSLCode檔案的。

首先在節點程式碼壓入HLSLCode之前,這張HLSLCode並不是空的,而是有一個模板的。然後HLSLTranslator會在這個模板框架下,將紅線的那些字串填充到這個模板中,最後點選Compile之後就會生成文章開頭那個截圖裡的HLSLCode了。這個模板在Shader目錄下 private->MaterialTemplate.usf裡。如果你想讓你材質編輯器的那個HLSLCode檔案包含你的usf檔案你可以直接在MaterialTemplate.ush中include你的usf檔案。這樣在編譯材質後,你自己的ush檔案將被包含進去。這樣你的customnode就可以直接呼叫你的ush裡的shader函數了。
這樣就可以輕鬆實現CustomNode裡的程式碼呼叫。但是這樣會比較麻煩。因為你稍微改動一下usf,ush就會有很多shader需要編譯成shadercache話題轉回來繼續我們的材質編輯器原理。HLSLTranslator會將字串壓入HLSLCode裡,它是把一個名叫MaterialTemplate.usf的檔案作為框架來塞的。我們只要在那些頂下的字串中新增我們的字串即可將我們自己的程式碼塞進材質編輯器的HLSLCode中。我們可以改一下引擎做個實驗開啟HLSLMaterialTranslator.h檔案,找到virtual int32 CustomExpression( class UMaterialExpressionCustom* Custom, TArray<int32>& CompiledInputs ) override函式,我們做如下修改:
編譯一下引擎,再開啟材質編輯器的HLSLCode,你將會看到我們的程式碼加進去了!!!(註釋也是程式碼,別看不起註釋!!!)當然你加如正常的一個函式也是可以的。這樣就可以實現CustomNode的函式呼叫了。下一節我們一起來自己做一個可以函式呼叫的CustomNode