MY BLOG DIRECTORY:

INTRODUCTION:

首先我不是專業圖形程式,我是一名技術美術。我的很多觀點和內容主要是為了實現遊戲內各種效果,如果我的演算法不夠高效,或者有錯誤,還請大神們斧正。我在此寫文章的目的其實更多是希望能跟大家探討共同學習進步,希望在評論區能看到有趣的觀點。

如果有問題歡迎加入技術美術QQ群一起學習:192946459

在開始前我希望你具備以下知識:

(1)虛幻4程式設計C++的相關知識和藍圖指令碼相關知識

(2)渲染圖形學的基礎知識,至少閱讀完龍書DX11

那麼下面我們就開始吧

MAIN CONTENT:

我們在開始玩兒一些花樣前,需要先把虛幻的渲染基本原理搞清楚。平時我們做一個虛幻的材質一般是用虛幻的材質編輯器製作的,所以會有很多人以為製作一個材質是一件非常輕鬆的事情,連連線就搞定了。之所以我們有這樣的錯覺,是因為虛幻什麼都幫我們做好了,但是如果你想做一些高階效果,材質編輯器可能就不行了,或者說效率很低。下面我們就來講述以下虛幻4的材質原理吧。

先上一個流程圖

虛幻4渲染程式設計(材質編輯器篇)【第一卷:開篇基礎】

虛幻4的一個視覺化節點就包含一段HLSL程式碼,透過我們的“連線”將HLSL程式碼拼接出來。最後會出一張ShaderTemplate檔案。虛幻4的材質編輯器,這些視覺化節點所生成的只是一堆函式而已。可以透過虛幻材質編輯器->window->HLSL找到我們材質所生成的這個ShaderTemplate

虛幻4渲染程式設計(材質編輯器篇)【第一卷:開篇基礎】

我們材質編輯器就是在生成這個ShaderTemplate和我們的完整Shader。我們先不管材質編輯器是怎麼生成完整Shader的。我們先把注意力轉移到這個ShaderTemplate上。

這個ShaderTemplate其實就是個函式庫,它會把這個材質的一些資訊透過透過這個傳遞給shader整個管線。當我們點選材質編輯器的Compile之後引擎會一次呼叫每個節點的Compile函式,會把視覺化節點的HLSL程式碼壓入這個ShaderTemplate中。既然是Template,它肯定有個已經寫好的框架,這個框架在引擎的Shader檔案中:

虛幻4渲染程式設計(材質編輯器篇)【第一卷:開篇基礎】

細心的人可能已經發現了,這個圖裡的程式碼和材質編輯器HLSL視窗開啟的程式碼很像。再來對比一下:

虛幻4渲染程式設計(材質編輯器篇)【第一卷:開篇基礎】

虛幻Shader檔案裡的MaterialTemplate。ush只是一個框架而已,虛幻材質編輯器會將正確的資料程式碼等填充進這個框架。在HLSLTranslator裡你能找到如下程式碼,一切就非常清晰了。

虛幻4渲染程式設計(材質編輯器篇)【第一卷:開篇基礎】

知道了這個原理我們已經能幹一些事情了,我們可以直接在MaterialTemplate裡include我們自己的usf檔案。

虛幻4渲染程式設計(材質編輯器篇)【第一卷:開篇基礎】

這樣你可以在CustomNode裡直接呼叫你的usf檔案裡的函式

虛幻4渲染程式設計(材質編輯器篇)【第一卷:開篇基礎】

虛幻4渲染程式設計(材質編輯器篇)【第一卷:開篇基礎】

話題轉回來繼續我們的材質編輯器原理。HLSLTranslator會將字串壓入HLSLCode裡,它是把一個名叫MaterialTemplate。usf的檔案作為框架來塞的。我們只要在那些頂下的字串中新增我們的字串即可將我們自己的程式碼塞進材質編輯器的HLSLCode中。

我們可以改一下引擎做個實驗

開啟HLSLMaterialTranslator。h檔案,找到virtual int32 CustomExpression( class UMaterialExpressionCustom* Custom, TArray& CompiledInputs ) override函式,我們做如下修改:

虛幻4渲染程式設計(材質編輯器篇)【第一卷:開篇基礎】

編譯一下引擎,再開啟材質編輯器的HLSLCode,你將會看到

虛幻4渲染程式設計(材質編輯器篇)【第一卷:開篇基礎】

我們的程式碼加進去了!!!(註釋也是程式碼,別看不起註釋!!!)

當然你加如正常的一個函式也是可以的。

這樣就可以實現CustomNode的函式呼叫了。下一節我們一起來自己做一個可以函式呼叫的超級CustomNode

下一節的內容我先上效果吧:

虛幻4渲染程式設計(材質編輯器篇)【第一卷:開篇基礎】

虛幻4渲染程式設計(材質編輯器篇)【第一卷:開篇基礎】

SUMMARY AND OUTLOOK:

材質編輯器可以幫我們快速準確完成底層種種設定,幫我們編譯出穩定高效,跨平臺不會出錯的Shader程式碼,這點對於只需要專注效果實現的人來說極為友好,不需要考慮什麼decodehdr之類的麻煩事情,缺點也顯而易見,就是太死,想加任何東西都要修改大量引擎程式碼。

Enjoy it

NEXT:

YivanLee:虛幻4渲染程式設計(材質編輯器篇)【第二卷:自定義光照模型】