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についてはここまでにしておきます。