#memo

indiedev太郎

Showdownのアスファルトマテリアル

M_AsphaltBlendNickを見る、水たまりの感じが理想なので
そこまで多くないなと思って見てたけど、マテリアルファンクションが最悪な感じで多かったので、重要そうなところをみる

はじめに、TextureCoordinateのCoordinateIndexについて

カスタム仕様の UV | Unreal Engine

Coordinates 表現式 | Unreal Engine

UE4ではUVを追加で作れて(DefaultはUV0)、そっちで処理できるほうが早いみたいなことらしい

このマテリアルではCoordinateIndexが2になっているので、まずそこの出力ノードを見てみる

https://i.gyazo.com/564cbba06a8798e8b852876f9b224acd.png

World OffsetのXYがCustmizedUV2に刺さっている、これで水たまりはメッシュ単位じゃなくなる

次、最終出力のWorldPositionOffsetについてちゃんとわかっていないので調べる

1.10 - World Position Offset | Unreal Engine

マテリアル側からの頂点移動、前水面をグネグネさせるときにもここを使った
このマテリアルでは

https://i.gyazo.com/141181fa2daf680c2cce0262fa79718a.png

後ろから見ていくと、(0, 0, z)の値を出力している、Z座標を変化
zの値は-8(変数) ~ 0の範囲で、頂点カラーが白に近いほど0になる
黒をペイントすると座標が少し下がる、どこまで演出になってるのかがよくわかってない

ここでようやく全体の構造、大きな流れとして
1. コンクリマテリアルを作る
2. コンクリマテリアルと変数を水たまりを合成する関数に入れる

の2工程に分かれている
1のコンクリマテリアルは結構単純で、インスタンス側である程度いじれるように変数をはさみつつBaseColor, Roughness, Normalを作成している
ココでキモっぽかったのが

https://i.gyazo.com/8ace59eff7822ec6f6399aaf9a5483ab.png

このアスファルトの柄をマスクで入れる部分、最初に書いたワールド座標依存のUVを使用するために、ベースとなるアスファルトのテクスチャ、ノーマル、ラフネスは全部UVにTexCoordIndexが2に指定してあるのだけれど、マスクだけはUV0のまま
つまりアスファルトの柄だけはメッシュ依存になってる

https://i.gyazo.com/1f080c58258a721803eea84c6caf57d1.png

ここがフェーズ2の水たまり関数に渡す引数を作成している部分
まずベースとなるマテリアルをすべて渡して、次に水たまりのUV、これはCoordinateIndex2がそのまま渡してある、後はPuddleMaskを渡してる、ここから水たまり関数GroundWetnessを見ていく

最悪をどこから見ていけばいいのやらだけど、大体はPuddleMaskをどうこうしているかんじ(おそらく)なので、アスファルトマテリアルに何を加えられているかを見ていく

以前自分で作ったものだと、水たまり部分はBaseColorを暗くして、Normalを平らにして、Roughnessを無くしていく感じにした、ここでも基本的には同じみたいで、LerpのAlphaをどう作成するかといった感じ

BaseColorはこれだけ

https://i.gyazo.com/816131e85aa2b34ec5a8b515760f4c4d.png

 

0になるほど湿ってて、1になるほど乾きを表現したマスクをAlphaで作成すればいい

https://i.gyazo.com/9f38d8a48b574c88f03eb6c1c1d1eb68.png

Mask部
頂点カラーを0-2.5の範囲に大きくして、そこからPuddleMask(0-1)をひいて更に-1(-2 - 1.5)
これをSharpness(Default: 1)で割る

これは何かというと、頂点カラーを使うことで、アウトライナーの方で白をペイントすると乾いて、黒をペイントするとびちゃびちゃにするみたいなことができる

最後に0-1の範囲にClamp
マスクはこれが基本で、あとはパラメーターごとにaddやらdivideで微調整といったかんじ
0になるほど湿ってて1になるほど乾いてるという意味のMaskをLerpのAlphaになげて、しめっているならAを、乾いているならB(元のアスファルトのマテリアル)を採用するのが基本構造

このMaskがRoughnessとSpecularとNormalにもつながっている、自分でやった時はSpecularは採用しなかったけど、Wetなら1にするといった単純なものだし使ったほうがいいのかも

Normalはちょっと複雑っぽいけど、単に水面にするだけならプレーンなノーマルをLerpのAに渡せばいいだけで、この関数では水のゆらぎが入っているのでわちゃっとしている
これは多分公式にある水面マテリアルチュートリアルの物とほぼ同じなので今回は割愛

というわけでそこまで自分が作ったものとの違いはなかった、頂点カラーでの制御がめちゃくちゃ便利っぽいなというのがすごい気付きなので早速やってみよう