[Omniverse] [Substance Designer] マテリアルの割り当て その11 (MDLでpositionを使用)

OmniverseでMDLを使用時に、position情報を参照します。
MDLファイルの作成はSubstance 3D Designer 2022を使用しました。
Omniverse Create 2022.1.1を使用しました。

positionを使う用途

[Omniverse] マテリアルの割り当て その6 (Material Graph)」ではOmniverse上のMaterial Graphを使用していました。
これをMDLに置き換えます。
これにより、地面に近づくにつれてコケの浸食が強くなる的な表現を行います。

レンガテクスチャのMDL

Substance 3D Designer 2022で以下のようにノードを構成しました。
レンガのテクスチャとして、DiffuseColorテクスチャ、NormalMapテクスチャを割り当てています。

これは「[Omniverse] マテリアルの割り当て その9 (MDLでテクスチャの繰り返しを指定)」で行った作業まで進んでいる状態です。
Irayでのレンダリングは以下のようになりました。
左がそのままの表現、右がDiffuseColorテクスチャをsRGBとした場合です。

Substance DesignerでのMDL Graph使用時のIRay表示の場合は、exposeするテクスチャを指定するとsRGBのテクスチャとして表現されないため、
一時的に「texture_2d(string,gamma_mode)」に切り替えるようにしています。

このときのPROPERTIESにてgamma_modeで「gamma_srgb」を指定すると、指定のテクスチャはsRGBで扱われます。

コケのテクスチャを指定

MDLで、「file_texture」ノードを配置し、Scalingを入力ピンとして有効にします。
Scalingにはfloat2をつなぎました。
テクスチャの入力は「texture_2d」をつなぎました。

「file_texture」の出力に「Selector」をつなぎ、出力はcolorとしています。
これでコケのテクスチャ色を取得するノードの組み合わせができました。

positionを配置、Y値を取り出す

positionノードを配置します。
これは、マテリアルを表現する表面の1点でのワールド座標での位置を検出します。
出力はfloat3になるため、このY値を取得するために「float3.y」ノードをつなぎました。

指定の範囲にClamp

positionのY値をclampノードを使用して指定の範囲内になるようにしました。

minYにYの最小値(この値以下の場合はminYになる)、
maxYにYの最大値(この値以上の場合はmaxYになる)を指定しました。

0.0-1.0の範囲になるように変換

Clampした値はminY~maxYの範囲のfloat値になっています。
これを0.0~1.0の範囲になるように変換しました。
「(Y - minY) / (maxY - minY)」の計算を行います。

以上をFrameで囲み「Position」としておきました。

減算は「operator-(<∗>,<∗>)」ノードを検索して追加しています。
除算は「operator/(<∗>,<∗>)」ノードを検索して追加しています。

floatをcolorに変換(グレイスケール)

※ この処理は見た目を確認するための一時的なものです。

color(float,float,float)ノードを配置し、ここのRGBそれぞれにつなぐとグレイスケールのcolorに変換されます。

DiffuseColorと乗算

※ この処理は見た目を確認するための一時的なものです。

DiffuseColorと0.0-1.0の範囲にしたcolorを乗算すると、minYに行くにしたがって暗くなる表現となりました。

乗算は「operator∗(<∗>,<∗>)」ノードを検索して追加しています。

分かりやすいように、minYを0.0、maxYを200.0と変更すると3D Viewでは以下のようになりました。

白(1.0)に近づくほどコケが生えるように、0.0-1.0を逆転

現状は地面の近づくほど黒く(0.0)なる表現にしています。
コケの合成を行う場合は、白(1.0)に近づくほどコケが生えるようにしたいため、
positionから得られたこのfloat値を逆転させます。
「1.0 - v」の計算を行います。
また、線形ではなく非線形でグラデーションを行えるようにするため「pow」を使うようにしました。
powは「a^b」の計算になります。

減算は「operator-(<∗>,<∗>)」ノードを検索して追加しています。

この結果をDiffuseColorのレンガ模様のテクスチャに乗算します。
powの値を変化させることで、以下のようにグラデーションを変化させることができました。

このpowの第二引数に入れる値はexposeして入力パラメータとして調整できるようにしました。
このグラデーションの値(float)は、最終的にはテクスチャ合成のときの重み(weight)値として使用します。

blend_colors

現在は一時的にDiffuseColorテクスチャに対して、positionから得られた0.0-1.0の値を単純に乗算していました。
これを、2つのテクスチャから得られるcolorを使って合成します。
「blend_colors」ノードを追加します。

color_1にDiffuseColorテクスチャからの色を入れ、
color_2にコケのテクスチャからの色を入れます。
出力にselectorノードを与えて最終的な出力をcolorに変換しています。

blend_colorsのPROPERTIESで「Blend mode」を「color_layer_blend」にしました。
blend_colorsはweight値により合成具合が変化します。

weight値が0.0に近づくほどcolor_1(DiffuseColorテクスチャ)の色に近づき、
1.0に近づくほどcolor_2(コケのテクスチャ)の色に近づきます。

このweightの入力として、positionから計算されたfloat値をつなぎました。

これにより、地面に近づくほどコケが濃くなる表現になりました。

Perlin Noiseを使用してノイズを加える

現状ではグラデーションが均一で面白みに欠けるため、Perlin Noiseを使用してノイズを与えることにしました。
「perlin_noise_texture」ノードを追加。
出力がtexture_returnであるためSelectorを追加。
selectorのPROPERTIESで「Member」を「mono」に変更しました。

これでPerlinNoiseの出力はfloatになります。

positionから得られたweight値(float)に、このPerlinNoiseの値(float)を乗算します。

乗算は「operator∗(<∗>,<∗>)」ノードを検索して追加しています。

これを、blend_colorsのweightに接続しました。

「perlin_noise_texture」ノードの「Upper threshold」「Lower threshold」「Tiling」などを変更すると、
ノイズのかかり方が変化することを確認します。

この3つのパラメータをExposeとして入力パラメータにしました。

Tilingはfloat3を指定しますが、float値をfloat3に変換してそれを入れるようにしました。

入力パラメータの確認

全体は以下のようになりました。

Exposeした入力パラメータのIdentifierを赤色で表示しています。

MDL Graphの何もないところをダブルクリックしてPROPERTIESにGraph自身のパラメータを表示します。

入力パラメータの順番を確認。
コケを与える情報にについては、個々の入力パラメータのノードにて「Koke」というグループを与えています。

MDLファイルをエクスポート

Substance DesignerからMDLファイルをエクスポートします。

エクスポートファイル名とGraph名は同じであることを確認しておいてください。
以上でSubstance Designer上の作業は完了です。

Omniverse CreateにMDLをインポート

Omniverse Create 2022.1.1を使用しました。
Stageウィンドウで形状を右クリックし、メニューより「Create」-「Materials」-「Add MDL File」を選択。
ファイルダイアログボックスが表示されるため、対象のMDLファイルを指定します。
読み込み後にMDLのコンパイルが行われます。

Propertiesウィンドウで入力パラメータが反映されているのを確認します。
DiffuseColorテクスチャ、コケのテクスチャのColor SpaceはsRGBに変更。
NormalMapテクスチャのColor Spaceはrawに変更しました。

パラメータを調整することにより、レンガ模様のコケのかかり具合を制御できるのを確認しました。

MDLはまだまだ深いのですが、MDLについてはここまでにしておきます。