マテリアルノードの解説 その3

今回でマテリアルノードの解説はいったん終了します。

今回解説する分でよく使うノードはほとんど解説できていると思います。

とは言え、あくまで自分がパッと見た中でよく使いそうなものをピックアップしているので、人によっては使わないノードや解説されていないけどよく使うノードなんかもあるかもしれません。

何よりパッと見た程度なので抜けはあるかもしれませんので、抜けがあった場合はしれっとその4が更新されてるかもしれません。

その際には、視野の狭いおっさんはこれだから…と思って生暖かく見守っていただけたら、と。

今回解説するノードは主にUE4のシステム寄りのものが多くなります。

あとはいくつかのマテリアルファンクション。

マテリアルファンクションはEngine側のコンテンツとして存在しているので、内部の動作をチェックすることも可能です。

では、続きを読むで解説本編へ。

・DepthFade

ue141.jpg

半透明マテリアルかポストプロセスでしか使えないらしいノードです。

このノードは描き込むピクセルの深度と深度バッファの深度の差が閾値内にある場合にOpacity(いわゆるα値)を0.0に近づけます。

これで何ができるかというと、半透明物が”刺さる”状態を低減してくれます。

入力のOpacityは元々のα値を、FadeDistanceにはフェードする距離(ビュー座標系での)を指定します。

例えばOpacityが0.5、FadeDistanceが100とすると、深度差が0の時に出力が0.0、深度差が100以上になったところで0.5、その間は0~0.5の間を(多分)リニア補間します。

”刺さる”状態というのは以下の画像を見てもらえるとわかりやすいのではないでしょうか。

ue142.jpg

左がDepthFadeを利用したもの、右が利用せずに”刺さって”いるものです。

この対応は煙などのボリューミーなパーティクルで利用されていて、パーティクルで使用されるとソフトパーティクルなどと呼ばれます。

・PixelDepth, SceneDepth

ue143.jpg

深度を取得する命令ですが、微妙に違う命令である点に注意してください。

PixelDepthはこれから描き込むピクセルの深度値を示します。つまり、これから深度バッファに描き込まれる深度ということです。

しかもなぜか2048が最大のリニアで入ってきてるらしいので、0.0~1.0にしたいなら2048で割りましょう。

SceneDepthはすでに描き込まれている深度値、つまり深度バッファの値を取得します。

深度バッファの値なのでUV座標を指定してどこの深度値も取得できますが、半透明マテリアルでなければ使えません。

ドキュメントでは0~2^24-1のノンリニアな値が入ってくるので…とか書いてあったのですが、これはなんかあやしい気がします。

少なくとも、ドキュメントに書かれている計算式ではリニアな0.0~1.0の深度値は取得できませんでした。

何より、Exampleとして作成されているマテリアルでは3200で割ってるし…

この辺はもっとしっかり調べないとだめかな、という気がしています。

・Time

ue144.jpg

時間を取得する命令です。基本的にはUVスクロールなどで利用される機能です。

時間の単位は多分”秒”ですが、いつからの時間か、というのはさすがにわかりません。

システム起動からの時間の可能性は高いですね。

Detailsタブに"Ignore Pause"というBool値が存在しますが、その名の通り、Pause状態でも更新するかどうかを指定します。

通常はDisableでいいのですが、ポーズメニューなどで利用する場合はEnableにしておく必要があります。

一定の周期でリニアに変化するようなものに利用するのが一般的で、細かな制御を行う場合はパラメータを利用して外部から入力するようにした方がよいでしょう。

例えば、雲や水の流れには使えますが、キャラクタの攻撃時に連動して動作する、というようなものには向きません。

・TwoSidedSign

ue145.jpg

ポリゴンを両面で描画した場合(マテリアルのDetailsタブ、"Two Sided"をEnableにした場合)に裏面と表面を識別するのに利用します。

表面なら1.0、裏面なら-1.0が返ってきます。

使い道は限られますが、ライティングされる板ポリゴン(草とか木葉でよく使われる)で法線方向を反転するのに利用されます。

ライティングを行う場合は法線方向が重要になるのですが、両面描画した際の裏面で普通にPixelNormalなどを利用すると表面向きの法線しか取得できません。

この状態で裏面からライトが当たると表面法線が出力されているので暗くなってしまうわけです。

そこで、通常取得する法線に対してこの値を積算することで裏面の法線を反転します。

もちろん、表面であれば1.0が積算されるだけなので変化しません。

あと、UE4では裏面のみ描画という機能がありません。表面描画、もしくは両面描画のみです。

どうしても裏面を描画したい場合、このノードの出力が1.0ならOpacity Maskの値を0.0にすることで対応できます。

下画像の左側が裏面のみ描画を実現したもの、右側が同じモデルを通常描画したものです。

ue146.jpg

・VertexColor

ue147.jpg

頂点カラーです。

正直な話、最近はあまり使われなくなってきているのですが、ハイポリモデルの場合はまだまだ使う道があるノードだと思います。

まあ、ローポリモデルの場合は頂点カラーの補間がわかりやすくなってしまうのでそのままでは使い道がないかな、とは思います。

ただ、GGXrdでは(こちらはUE3ですが)頂点カラーにアウトライン用の反転モデルを描画する際に膨張率等のパラメータを入れていたようです。

頂点カラーだからと言って必ずしもカラーを入れなければいけないわけではないので、別の情報を格納して利用する手段はいまだに使える技術だと思います。

・Blend_~

ue148.jpg

Blendsカテゴリに存在するこれらのノードはPhotoshopのカラーブレンド手法を模して作成されています。

前回紹介したDetailマッピングを行う場合に単純なアルファブレンドではなく、Photoshopのレイヤーで利用できるブレンドを使いたい、という要求はほぼ必ずデザイナさんから上がってくるはずです。

そんな時はこれらのマテリアルファンクションを教えてあげて、対応するPhotoshopのブレンドを利用してもらいましょう。

・MakeMaterialAttributes, BreakMaterialAttributes

ue149.jpg

マテリアル情報を構造体として作成するのがMakeMaterialAttributesで、この構造体から各パラメータを取得するのがBreakMaterialAttributesです。

マテリアルを新規作成すると必ずマテリアル出力のノードが作成され、BaseColorやMetallicなどのピンが存在しますね?

実は、これをマテリアル構造体としてまとめることができます。

Detailsタブの"Use Material Attributes"をEnableにするとマテリアル出力ノードは"Material Attributes"というピンだけになります。

ここに入力できるのがMaterial Attributesと呼ばれる構造体なのですが、Make~はこれを作成することができます。

基本的にはマテリアルファンクションで用いるものですが、通常のマテリアルでも使用することは可能です。

Break~はこのようにして作成したMaterial Attributesを分解し、各パラメータを取得できるようにするノードです。

Make~と比べるとあまり使わないかもしれませんね。

・MatLayerBlend_~

ue150.jpg

Material Attributesの特定パラメータに追加の処理を施し、新しいMaterial Attributesを求めるMaterialLayerBlendカテゴリの関数群です。

例えば、MatLayerBlend_AddWorldPositionOffsetなら、元のMaterial AttributesのWorldPositionOffsetに新しいOffsetを加算します。

これらの機能は先に記述したMakeMaterialAttributesノードで作成した2つ以上のマテリアルをマスクテクスチャなどでブレンドするのに向いています。

例えば、鉄と錆びた鉄のマテリアルが存在していたとして、鉄のパイプをゲーム中に出現させたいとしましょう。

この際、普通の鉄マテリアルだけを使ってしまうとピカピカしすぎて不自然です。

だからと言って錆びた鉄だけを利用すると何もかも錆びだらけでやっぱり不自然です。

パイプなので、液漏れが発生しやすい場所は錆びやすくなりますし、掃除しやすい部分であれば錆びにくくなります。

これらをマスクテクスチャを利用してブレンドする際にこのカテゴリの関数が役に立ちます。

その場合は特にMatLayerBlend_SimpleかMatLayerBlend_Standardが役に立つのではないかと思います。

・FunctionInput, FunctionOutput, MaterialFunctionCall

ue151.jpg

FunctionInputとFunctionOutputはマテリアルでは使用できません。マテリアルファンクションでのみ使用できるノードです。

名前の通り、マテリアルファンクションの入力と出力です。

FunctionOutputは入力ピンに刺したものの型をそのまま出力しますが、FunctionInputはDetailsタブで型を指定します。

また、どちらもそうですが、Detailsタブの"Sort Priority"は関数として利用したときの入出力ピンの順番を指定します。

マテリアルファンクションを作成する人はこの順番がわかりやすくなるようにパラメータを設定するべきでしょう。

MaterialFunctionCallは作成したマテリアルファンクションを呼び出す命令です。

ノードを選択して配置するだけですと、画像のように"Unspecified Function"と表示されます。

Detailsタブで使用する関数を選ぶと、ノード名は関数名になって入力、出力ピンが表示されます。

コンテンツブラウザからドラッグ&ドロップした方が早いかとは思いますが、わざわざコンテンツブラウザを見るのが面倒、どのフォルダに目当ての関数があるかわからない、といった場合に使用しましょう。

・TextureObject

ue152.jpg

前回解説していなかったのですが、TextureSampleはUV以外にTexという入力ピンを持っています(下画像参照)。

ue153.jpg

マテリアルにTextureSampleを配置してもこの入力ピンは見えませんが、マテリアルファンクションに配置した場合は見ることができます。

ここに入力することができるのがTextureObjectノードです。

このノードはまさに”テクスチャそのもの”のノードで、これだけではテクスチャサンプリングができませんので、マテリアルファンクションを利用しない場合は不要なノードです。

どんな状況で使うのか、というと、必ずテクスチャで指定させたい何かがある場合、でしょうか。

例えば、BaseColorを2つのカラーでブレンドする関数の場合、BaseColorとして定数とテクスチャという場合もあるでしょうから入力ピンは2つのカラーを作成した方がよいでしょう。

そこにはテクスチャをサンプリングしたカラーを入れてもいいし、定数を入れてもいい、という形が取れます。

では、別の例としてFlowMapと呼ばれる技術を紹介します。

FlowMapは水の流れなんかを複雑に行いたい場合に利用される技術で、Valve社のPortal2なんかで使われています。

通常のUVスクロールでは一定方向にしか水が流れませんが、これでは岩を避ける水流、渦巻きなどを表現する際にそういうスクロールをするためのUV設定を行わなければなりません。

FlowMapでは水の流れを示したテクスチャを用意し、これをサンプリングしてから他のテクスチャを流れに合わせたUV座標でサンプリングします。

当然、FlowMapとなるテクスチャはテクスチャで与えなければ意味がないので(不要ならただのUVスクロール作ればいい)テクスチャを入力ピンとして持ちたい。

この際にFunctionInputの"Input Type"でTexture2Dを指定していれば、この関数を用いる側がここにTextureObjectを刺せるようになります。

ちなみに、FlowMapのマテリアルファンクションはUE4標準で存在しています。

さて、今回の解説は以上です。

あとは大半が関数なので、関数名と中身をチェックして何をしているのか理解するといいんじゃないかな、と。

まあ、私もすべてのノードを網羅しているわけではないので、実はかなり使える関数とか埋もれてるかもしれません。

そういうのがあるようでしたら教えていただけるとありがたいですね。