Gaming Life

一日24時間、ゲームは10時間

ほぼ週刊UE4日記01 マテリアルで色んな図形を描く1

最近、諸事情でUE4に触る機会が少ない。しかしドンドン進化するUE4をもっと使えるようになりたい。

というわけで始まった、UE4を触って得た何かを、毎週記事にして、UE4に慣れ親しんでおこうという突発企画。

いつまで続くかはわからないが。

今回の元ネタ・参考記事

docs.google.com

nn-hokuson.hatenablog.com

Unityシェーダーを使って、お絵かきする人の記事を見て、じゃあUE4のマテリアルで同じことやってみよう、という話。

2色に塗り分ける

以下のようなMaterial Function、「MF_SimpleStep」を用意

f:id:ai_gaminglife:20190409234434p:plain

中身はUnityのシェーダでいうところのstep関数。UE4標準でValueStepという、同じようなことを実現する関数があるが、個人的に使い勝手が悪いので自作した。

これを使えば、簡単に2色に塗り分けられる。

f:id:ai_gaminglife:20190409234447p:plain

「MF_DrawCircle」を作成。

f:id:ai_gaminglife:20190409234459p:plain

これを使えば円を描画できる。

f:id:ai_gaminglife:20190409234510p:plain

アンチエイリアスな円

「MF_DrawSmoothCircle」を作成。

f:id:ai_gaminglife:20190409234531p:plain

これを使ってアンチエイリアスの効いた円が描ける。

f:id:ai_gaminglife:20190409234547p:plain

繰り返しの輪

参考スライド43枚目以降を参考に実装。

f:id:ai_gaminglife:20190409234602p:plain

frequencyの数字を大きくすれば細かい輪を描画できる。

f:id:ai_gaminglife:20190409234614p:plain

大きさが変化する輪

f:id:ai_gaminglife:20190409234638p:plain

結果

f:id:ai_gaminglife:20190409234643g:plain

TimeノードをSin関数に流すことで、-1から1までの範囲でなめらかに変化する値が得られる。その絶対値を取れば、0から1までの範囲でなめらかに変化する値が得られる。

この値を使って、円の内側と外側の円の半径の長さを決定する。先程作成した「MF_DrawCicle」関数を2つ使って輪の外側と内側を作成し、外側を内側の円でくり抜けば、大きさが変化する輪が作成出来た。

縞模様

縦縞を生成する「MF_Strive_U」。

f:id:ai_gaminglife:20190409234656p:plain

TexCoordにR値でマスクを掛けると、U方向のグラデーションが得られる。

あとは、こちらの記事を参考にすれば実装できる。

横縞を生成する「MF_Strive_V」は、TexCoordをG値でマスクを掛けて得られるV方向のグラデーションを使えばよい。

f:id:ai_gaminglife:20190409234710p:plain

市松模様

こちらの記事にして実装。

f:id:ai_gaminglife:20190409234723p:plain

時間で変化するハート模様

ハートを描く数式にはこちらのサイトのものを、実装自体は参考スライド49枚目以降を参考に実装した。

f:id:ai_gaminglife:20190409234736p:plain f:id:ai_gaminglife:20190409234737g:plain

Customノードの中身は以下。

st = (st - float2(0.5, 0.70)) * float2(2.1, -2.8);
return pow(st.x, 2) + pow(st.y - sqrt(abs(st.x)), 2); 

まとめ

UE4のマテリアルは、Unityのシェーダと違い、作成途中の計算結果を、簡単にプレビューできる為、試行錯誤が容易にできる。触っていてとても楽しいので、もう暫く遊んでみたい。