PaperSloth’s diary

主にゲーム開発関連についての記事を書きます。

UE4 推しに学ぶMaterial入門

この記事は もなふわすい~とる~む Advent Calendar 2021 - Adventar
12/8(8日目)の記事です。
先日12/7はこまつさんのLooking Glass Portrait用の推しの画像を3D TextureでUnityに召喚する記事でした。
GitHub - troubear/MonafuwaGlass: もなふわすい~とる~む Advent Calendar 2021 12/7(7日目)の記事


環境

UE5.0.0 Early Access 2
UE5を使用していますが、UE4でも同様に動作します。

Texture2D To CubeMap

Material 全体像は以下です
f:id:PaperSloth:20211205021215p:plain

これだけでTexture2DをCubeMapに変換してくれます。
Materialの設定は「Unlit」にして「Two Sided」を有効化しています。

あとは特大Sphereに割り当てるだけで、ミテルゾSkyの出来上がり!
難点としては元々CubeMap想定で作られていない画像をCubeMapに変換するため、画像が伸びてしまってかわいさが半減します。
f:id:PaperSloth:20211205021518p:plain

Mosaic PostProcess

Material 全体像は以下です
f:id:PaperSloth:20211205022629p:plain

Materialの設定としては「MaterialDomain: Post Process」です
あとはこのMaterialをPostProcess Volumeに追加
f:id:PaperSloth:20211207151951p:plain

特大Planeに推しのTextureを割り当てるだけでなんだか意味深な感じになります。やったね!
f:id:PaperSloth:20211207151813p:plain

SphereMaskで穴あき PostProcess

Material全体像は以下2枚です
前半
f:id:PaperSloth:20211207153008p:plain
後半
f:id:PaperSloth:20211207153025p:plain

こちらもMaterialの設定としては「MaterialDomain: Post Process」です
先程同様にMaterialをPostProcess Volumeに追加
f:id:PaperSloth:20211207153106p:plain

特大Planeに推しのTextureを割り当てるだけでまたなんだか意味深な感じになります。やったね!!
f:id:PaperSloth:20211207153251p:plain

RGBずらしPostProcess

Material全体像
f:id:PaperSloth:20211207160437p:plain

シンプルにOffsetXとYのRGBチャンネルに適当な値を入れてズラすだけです。
こちらもMaterialの設定としては「MaterialDomain: Post Process」です
先程同様にMaterialをPostProcess Volumeに追加
f:id:PaperSloth:20211207160528p:plain

特大Planeに推しのTextureを割り当ててそれっぽい絵になったことが確認できました。
f:id:PaperSloth:20211207160614p:plain

おまけ
PostProcessInput0 をRGBに割り当てるだけで以下のようにそれっぽいグレーな絵になりますね
f:id:PaperSloth:20211207154128p:plain
f:id:PaperSloth:20211207154307p:plain

ババーンって感じの集中線のWidget用Material

Material全体像
f:id:PaperSloth:20211207162951p:plain

なんかエイってやってバーンなやつです
Noise作ってLerpで適当な形にくり抜くだけのシンプル構成です

あとはWidgetを作ってWidget内にImageを置いてMaterialを割り当て
f:id:PaperSloth:20211207163133p:plain

LevelBlueprintでWidgetを作成して画面に割り当て
f:id:PaperSloth:20211207163139p:plain

あとはPlayすればババーンって感じになります
f:id:PaperSloth:20211207163441g:plain


Material 入門

ここまでは割とお遊び的なアレです。

ちゃんとMaterialの説明をしていくよ。
UE4のPBRMaterialでよく使う以下のParameterについて
・BaseColor
・Metallic
・Specular
・Roughness
・Emissive Color
・Opacity
・Opacity Mask
Emissive Colorは例外ですが、基本的な考え方としては色情報やParameterは0~1の範囲で扱います。
これはもう一方のUなエンジンでも大体同じですね。
大雑把に言ってしまうと色情報の白が1で黒が0です。
(実際はUE4のBaseColorに1以上の割当をしてしまっても不具合にはなりません。1, 1, 1と同じ結果になるように処理されています)

階調反転

OneMinus(1-x)のノードを使用します。
今回使用しているようなカラー画像に適用するとヒェって結果になりますが
白黒の画像を用意するとわかりやすいですね。
OneMinusはその名前の通りで 1から入力された値を引いたものになります。
f:id:PaperSloth:20211207165105p:plain

色の合成について

Addは色情報の加算
Multiplyは色情報の減算
f:id:PaperSloth:20211207165905p:plain

上記で上がベースのTexture、下がMask用のテクスチャとしています。
黒(0, 0, 0)にベースのTextureが加算されるとベースのTextureの色がそのまま出力されます。
逆に白(1, 1, 1)にベースのTextureを加算してもBaseColor的には1, 1, 1になります
f:id:PaperSloth:20211207170325p:plain

Emissiveの場合は若干光ります
f:id:PaperSloth:20211207170406p:plain


次にMultiply(乗算)を行った場合ですが
この場合は白(1, 1, 1) x ベースTextureではベースTextureの色がそのまま出力されます。
逆に黒(0, 0, 0) x ベースTextureでは0 と掛け合わせているため、黒(0, 0, 0)が出力されます。

これがShaderでMaskする際や色計算をする際の基本になります。

Subtract(減算)については、Multiply(乗算)と逆の結果になります。
f:id:PaperSloth:20211207201107p:plain

また、SubtractしてOneMinusをするとAddと逆の結果になります。
f:id:PaperSloth:20211207201245p:plain


おまけ
Maskした範囲に色を乗せる例
f:id:PaperSloth:20211207201506p:plain

色をAddする際にTextureを割り当てて別のMaskと加算といったこともできます。
f:id:PaperSloth:20211207201756p:plain

0 ~ 1で収めるということについて

先程の画像でさらっとsaturateが登場しています。
このノードは入力された値を 0 ~ 1の範囲に収めるというものです。
例えば、R: -1, G: 100, B: 0のような色があった場合に 0 - 1の範囲に収めて
R: 0, G:1, B: 0といった結果になります。

saturateとClamp(in, 0, 1)は同じ結果です。
f:id:PaperSloth:20211207202043p:plain

0 - 1の範囲で計算が行われるのがベースということを踏まえて
R:-1, G:100, B:0 に対してsaturateを行った後にOneMinusを行えば
R:0, G: 1, B: 0からR: 1, G:0, B:0になります。
f:id:PaperSloth:20211207202318p:plain

色の合成についてのまとめ

Material(Shader)には他にもUVをこねこねしたり、頂点シェーダーをこねこねしたり、Timeを活用したり
語るべきことは沢山あるんですが、基本としては上記の原則のように0~1の範囲で色が表される
ということを抑えておけばいいかと思います。
この色をこねこねするということ、0 - 1の範囲で値を計算するということについてはもう一方のUのエンジンでも基本的には考え方は同じです。

おまけ。Timeを活用した例
f:id:PaperSloth:20211207202902g:plain
f:id:PaperSloth:20211207202932p:plain

まとめ

PostProcess多めであんま画像関係ないじゃん!って感じになってしまった( ´∀`)
かわいいからヨシッ!

※穴開けに関して、昔見かけたツイートをそのまま記事にしたような感じなんですが、誰のどのツイートか忘れてしまった……