UE4 Material CheatSheet

この記事は[Unreal Engine 4 (UE4) Advent Calendar 2020 その1](https://qiita.com/advent-calendar/2020/ue4)の17日目の記事です。

#この記事の内容
Materialで出来るいくつかの面白い表現を僕自身の備忘録として共有していきます。

#環境
UE4.25.4

#Fresnel(フレネル)
オブジェクトのPixelNormalとCameraVectorのDotによってオブジェクトをハイライトする処理です。
現実世界で観測できる表現だと、【水溜まり】などがあります。水面を見る角度によって反射率が変わるアレです、アレ。
詳しくは[公式ドキュメント](https://docs.unrealengine.com/ja/RenderingAndGraphics/Materials/HowTo/Fresnel/index.html)をご覧ください。
このフレネルで表現できる面白い表現について、いくつかご紹介していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/4b65c92c-ce0b-5c84-1075-a6fedd0b9fab.png)

##Edge Hightlight(エッジハイライト)
###結果
こんな感じでオブジェクトのエッジ部分をハイライトすることが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/693e1eac-085e-9731-cb57-ad047c62a80b.png)
###ノード
非常にシンプルですね。オブジェクトのエッジ部分にだけEmissiveを追加しています。ExpInの値を大きくするとエッジの赤い所をよりシャープにできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/f8a81ff7-d011-5fa3-8de2-3869a4b925d1.png)

##Outline(アウトライン)
###結果
↑とほぼ同じですが、使用するノードを変えるだけでさらにいい感じにアウトラインっぽく見せることが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/f55b281d-e080-675f-cd14-5e154f90b8c4.png)
###ノード
Fresnel + Cheap Contrast...最強ですね。簡易的なアウトラインはこれでいいんじゃないですかね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/a2ebe7ec-3866-6201-1a51-261afd118b98.png)

#BoundingBoxBased 0-1 UVW
オブジェクトのバウンズを取得してくれます。このノードは、オブジェクトが回転しようがバウンズには影響を及ぼしません。
オブジェクトの頭から下にいくにつれて暗くなっていくイメージですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/a48bf965-bae7-2268-4ca3-78818ab9447d.png)

##Bounding Box Gauge
###結果
こんな感じでオブジェクトベースで簡単なゲージが表現できます。(リズム天国のロボット工場とかが作れる！)
![Videotogif (4).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/1732e7e4-6c4c-22cc-69ef-ac802100efe8.gif)


###ノード
RGBのB(すなわち、XYZに直すとZ)をScalar Parameterで引き算することで実現しています。
####Ceil
ceilに関しては White-Blackのグラデーションを消す為に使用しています。
####Saturate
0-1間でクランプする為に使用。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/5028f6a2-60e9-7896-410a-60ebfd30f6f9.png)

##Bounding Box Gauge Edge Detection
###結果
こんな感じでBoundsベースでLineをアニメーションさせることが出来ます
![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/0f354d47-593c-1a1e-e87e-c47f9f892f32.gif)

###ノード
####Multiply
ラインの太さを設定できる。数字が大きくなればなるほど、線は細くなります。
####Saturate
掛け算をして、0-1の範囲を超えてしまっているので0-1間にClampしています。
####Sine
エッジ抽出の為に使用しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/b5c68774-da1c-ce80-dc49-e719ed16b447.png)

これらの処理を上手く組み合わせると↓のような表現が出来ます！(かっこいい！！)
https://twitter.com/UnrealYoshida/status/1335307331312123904?s=20

#TextureCoordinate
テクスチャの座標系を取得することが出来ます。タイリングテクスチャなどを使用する際はよく見るノードだと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/4b1fff3c-4c04-fa20-c48a-3803b42d7bf3.png)


##タイリングをパラメーター化
TexCoordのタイリング数をパラメーターにしたい時があると思います。そんな時は...
こんな風にすればタイリング数をパラメーター化できます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/553d01e9-e6a4-08a6-822f-9a36ac69aefa.png)
こっちでも行けるよ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/0a13f189-b769-d47e-1153-082710123984.png)

##テクスチャをずらしたい...
そんな時は...
足せばいい！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/40085b0e-e827-5c17-9d90-d1f1b0bfc10f.png)

#Panner
テクスチャをアニメーションさせたい時に使用します。めっちゃ便利！
*Coordinate* 引数にはアニメーションさせたい座標系を
*Time* 引数は入力しなくても、デフォルトでTimeノードが入力されます(内部処理でそうなってるのかな？)固有のタイミングでのみ、アニメーションさせたい時などに使用すればいいと思います。
*Speed* 引数は文字通り、どれくらいのスピードでアニメーションさせるのかを設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/6ffe2f7b-2472-1ff4-f4b6-1c0546df1f03.png)

##ありがちな使用方法1
見たことあるノードが...
CoodinateはTexCoordだとして、*Speed*引数ですが、UVそれぞれのスピードを設定した後にAppendしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/c94f24ab-7a24-1853-02a4-aceb7257bb62.png)

##ありがちな使用方法2
*Time*引数にSine(Time)が入ってきました。Sineは-1 - 1を返すので、UVのSpeedが一定間隔で逆になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/675da22a-b4f7-c0c6-0781-023e8876fadc.png)

#Time
経過時間を取得できます。この値は無限に増え続ける...んですかね？詳しい方教えてください。
また、Lightmapにベイクされるときに使用されるTimeの値は *0.0* だそうです。参考)https://twitter.com/shiba_zushi/status/1332315332728406020?s=20
(勉強になりました、ありがとうございます。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/211afd2d-7897-cf11-2af1-48c8835b70bc.png)


##もっと遅く時間が進行してほしい...
そんな時は...
かければいい！2にすれば2倍に、0.5にすれば半分の速度になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/37aa3817-ab07-4dd4-abd9-3f683aa303de.png)

##0から0.99までの数字が欲しい...
そんな時は...
Frac!!小数点以下の数字を取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/f39968b3-a846-4db9-55dc-1758f241d591.png)

##-1から1までの数字が欲しい...
Sine!!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/e46cab05-5ccd-ceb5-abab-7d41efc7b5e4.png)

##0から1までの数字が欲しい...
そんな時は...
これ！
Sineは-1から1なので、1を足すことによって2から0になります。
そこから2で割れば、0から1の完成です。かんたん！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/3bf9a15c-0a0b-b327-91ca-4cd988f4596a.png)

ちなみに*ConstatnBiasScale*ノードを使うことで、上記の処理を1ノードで完結させることも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/56a46bb7-e2a4-4ae7-60d3-0f96573d3827.png)


#Noise系ノード
処理負荷がそこそこ重いらしい(噂)なので、あくまで本番用のNoiseテクスチャが来るまでのつなぎとして使ってください。重いけど使いやすい！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/dc341f5a-95e4-4008-dbe2-0d187416c204.png)

##VectorNoise
僕自身、SF的なShaderが好きなのでよく使ってます。
例えば、VectorNoiseをOpacity Maskにそのままつなぐと...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/0054d5dd-1d3c-4ede-d8d9-e49ef6f8ddb7.png)
こんな感じになります！既に少しかっこいい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/8d1d98d0-f343-5898-3f3a-efaaefeacf1f.png)
それに、EmissiveとPannerを足すと...
![ダウンロード (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/472ba6da-e703-6042-0243-e3d6c7221ec6.gif)
おおお！！！
的な感じで普段は遊んでます。

##Noise
Roughnessにぶち込むと割といい感じになってくれる...
くらいしか使ったことないです。
パラメーターのTurbulenceをOffにすることで、いい感じのFlowテクスチャ(FlowMapではない)が作れるらしいので試してみてもいいかもですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/9b705223-ffc2-87d4-c909-bfdde58bf629.png)

#Lerp
こちらに関しては[Unreal Engine 4 (UE4) その2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/ue4_due)の1日目でくろさわさんが詳しく解説してくれていますので、こちらをどうぞ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150286/cff7c404-01bc-0912-a7a3-370fb23a411d.png)

#おわりに
なんか雑なメモみたいになってしまって申し訳ないです...。これからUE4のマテリアルを始める人の為になると信じて、2020のアドカレ記事を終わろうと思います。
明日は、huacomeさんの「とにかく何か書きます！」だそうです。
一体何を書いてくれるのか楽しみですね。では。