Go our for Creation

UE4始め3DCGとか、プログラミングとか、カメラとかとか。

UE4のハイトマップのノード処理を何となくグラフで可視化しようとしてみた

(※5月19日追記 Clampの箇所を書き直しました。unwithererさん、ありがとうございます!!)

 

UE4マテリアルデザインの本を読んでいる中で何となく気になった箇所があったので、備忘録的に更新。本のなかでも「理屈で考えずに」と言われているのでひっそりとまとめてみる。

www.amazon.co.jp

※記事の内容に誤りがあればご指摘頂けると幸いです。。

 

記事の内容を無理やりまとめるとするなら、

「此処で述べられているハイトマップ処理の裏でなされている計算を視覚的に考えてみた」って感じでしょうか。。

 

「第9章 古く汚れた壁を作成しよう」p.230より、

ブロック壁面+漆喰剥げを表現するためにベースカラー/ラフネス/ノーマルマップそれぞれ2通りのテクスチャをブレンドしたのち、頂点カラーを塗り塗りして漆喰の剥げを表現していく工程。

 

塗るブラシにもマップを使ったほうが複雑な表現が出来るよね、という箇所で下記のようにBlueprintを組むことになります。

f:id:shin_t_o:20170515010342p:plain

 選択状態にある箇所の[Multiply]・[Add]・[Power]・[Clamp]ノード、一体何してるんだろと少し考え込んでこんなグラフが浮かびました、というのが今回の記事の流れ。

 

 

 ハイトマップ内に引いた或る直線の始点・終点(x:0~1)に沿って、白黒の高さデータが対応している①の灰色線のような関数 f(x):0~1を考えてみます。凸凹のハイトマップの1断面を切り取って横から高さを見た感じです。

(実際にはpixelデータなので、曲線ではない不連続ステップ関数になるはずですが、今は簡略化して曲線で表示)

 

対してVertexColorはy=kk:0~1)の定数と置き換えられるので、グラフ上に載せると②のように横1本の直線に。これを前提として、選択箇所の処理をグラフに置き換えてみます。

f:id:shin_t_o:20170519003100p:plain

 

①Multiply

ハイトマップデータ(y=f(x))とVertexColor(y=k)の積によって、縦軸方向に少し縮尺が変化した関数y=kf(x)が生成されます(赤線)。

 

②Add

それに対して再度VertexColorを加算することで、グラフ的には縦軸方向への平行移動が生じ、

y=kf(x)+k=k(1+f(x))

となります。

 

③Power

コレを指定値ぶん累乗するということは、

y=(k (1+f(x)))^n

となります。指数関数なので、1より大きい値はより1から離れ、1より小さい値は急速に0に収束します。1を軸として上下に引き伸ばす感じでしょうか。

 

Clamp

引き伸ばした関数を0〜1の範囲で切り取る、足切りならぬ頭切りの作業です。

具体的には、対象範囲で1を越えるような値は全て1とする(累乗のため値がマイナスになることはない)ということです。ムリくり式で表すならば、

y=(k (1+f(x)))^n (y<1の場合)

y=1 (y≧1の場合)

となります。

実際にはハイトマップは2次元データなので、y=f(x,y)x,y:0~1)と書くのが正しいのですが。…などとだらだら述べてきたところで、もはやごちゃごちゃしててあんまり数式を追う意味もなくなってきたので、グラフでどうなるかだけイメージしてみます。 

 

 

③のPowerによって、元々1より大きかった値はぐーんと大きくなり(頭が切られて皆1=白に)、1未満の数は0に収束していきます。事例だとなめらかな曲線ですが、その勾配がどんどん鋭くなっていくイメージです。どうでしょう、白黒はっきりつける「コントラストを強める」という直感に合うのではないでしょうか。

 

…ごめんなさい、それが言いたいがためにこんなに長文になりました。

特にオチはないです。終わり。

 

※マテリアル本だとnをMaskContrast値と名付け、値を20に設定しているようですが…20乗もしたら値が飛び跳ねそうな気が。