読者です 読者をやめる 読者になる 読者になる

妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

水のマテリアル研究⑭ IFノードを使った色の塗り分け

ブループリント UE4.13

「ニュース見てたら、この水あんまり見かけない感じのマテリアルだなと思って見てたんだけど、よく考えたらニュースだから普通に海の映像撮ってただけということがあって……」

妹「わかる。わたしも本物の木はコリジョンがよくできてるなあと感心している」

「あー、あれはよく出来てるよね。細い部分とかもしっかり当たり判定あるから」

imoue.hatenablog.com

「で、一昨日やった案なんだけど、数字がマイナスになってたりノードの使い方で無茶してるから、2色の組み合わせ次第では上手くいかなかったりもするので、もう少しいい感じの案がないものかと検討してみた」

f:id:una_unagi:20161219223427g:plain

「今回もアプローチは同じで、Fresnel関数の結果を利用してる。ただFresnelのパラメータは初期値のままで、途中にノードを追加してる。要するにLerpのとこで色を混ぜ合わせるの数字をどうするかっていう問題だから、そこをこっちでコントロールしようという試み」

f:id:una_unagi:20161219224238p:plain処理前
f:id:una_unagi:20161219224246p:plain処理後

「最初の状態だと明るい部分が強すぎる。凄く明るい部分はそのままで、ちょっと明るい部分から真っ暗までを一律真っ暗にしてしまおう……というようなノードの組み方にした」

f:id:una_unagi:20161219224833p:plain
f:id:una_unagi:20161219224841p:plain

「最終的にこんな感じにパラメータを調整して、いい感じの見た目になった。これだと0.0~1.0の範囲内の数字で無理なく塗り分け出来る」

妹「このIFというノードはなんですかな?」

「普通のブループリントでいう、Branchの親戚みたいなやつ。今回の場合、0.9以上の場合はそのままの数字を、0.9未満の場合は0を返す設定にしてる。それがLerpにつながってるから、結果として0.9付近で急激に色が変化する」

妹「普通にBranchノードで良かったのでは?」

「マテリアルの場合は実行ピンがないから、同じ仕組みのノードは作れなかったんだと思う。どういう場合でも、何かしらの数字が出てこないと困るから。Branchの場合は片方つながってなかったりしても兵器なんだけど」

妹「ちょっと明るいとこの境界がギザギザしてるかなあ……」

「本当はブループリントでいうEaseノードを使いたかったんだよ。直線的なLerpじゃなく滑らかに補間出来るやつ。ただマテリアル用がどうにも見つからなかったのでこういう方法になった。IFを複数組み合わせて数段回に分けたり、別の計算と併用すればもっと見栄えよくなるかもしれない」