[Omniverse] マテリアルの割り当て その8 (MDLでテクスチャを使用)

  • by

前回に引き続きSubstance DesignerでMDLを作成し、それをOmniverseで使用します。
Substance 3D Designer 2022を使用しました。
Omniverse Create 2021.3.8を使用しました。

テクスチャを使用

Substance Designerでテクスチャを使用する場合は、あらかじめパッケージ(sbs)に対してリソースとしてテクスチャを読み込んでおく必要があります。
EXPLORERウィンドウのxxxx.sbsを右クリックし、ポップアップメニューで「Import」-「Bitmap」を選択。

pngやjpegファイルを指定します。
「Resources」にテクスチャが追加されます。

BaseColorのテクスチャと法線マップのテクスチャを追加しました。
これは、最終的にエクスポートするMDLファイルのリソースとして追加される要素になります。

テクスチャをノードに加える

Colorを割り当てている箇所をテクスチャに変更します。
base Colorは「diffuse_reflection_bsdf」と「directional_factor」に接続されていました。

この2か所を変更します。

Graphの何もないところをクリックし、Spaceキーを押します。
この操作により、MDLとして配置できるノードが一覧されます。
上部の検索部で「color_texture」と入力し、color_textureノードをGraphに追加します。

color_textureの入力をドラッグしてマウスを離すと、入力に追加可能なノードが一覧されます。
先頭の「texture_2d」を選択しました。
これは、テクスチャを指定するノードになります。

textureノードを選択し、PROPERTIESで「texture(texture_2d)」の下の入力フィールド右の「…」を選択するとポップアップメニューが表示されます。
「From Resource」を選択すると、リソースとして読み込んだテクスチャを指定するウィンドウが表示されます。

テクスチャを指定すると、以下のようになりました。

「color_texture」の入力として「texture_2d」のテクスチャが接続されました。
元のテクスチャに比べて白くなっている件については後述します。
「color_texture」の出力は「color」になります。

「color_texture」の出力を、「diffuse_reflection_bsdf」と「directional_factor」に接続しました。

これで、単色の色はテクスチャ色に置き換わりました。
不要になった「Base Color」ノードを削除しておきます。

テクスチャが白い ?

画面下のプレビューはMDLの場合はIrayでレンダリングされます。
これはOmniverse上のIrayの表示と同じものです。
右のプレビューがオリジナルのテクスチャです。

ところで、テクスチャが元のpng/jpegに比べて白くなっています。
これは物理ベースレンダリング(PBR)/物理ベースのマテリアルの場合にテクスチャを含む「色」について、「リニアワークフロー」になっているかどうか、というのが要因となりそうです。
まずはリニアワークフローについてさらっと説明しておきます。

リニアワークフローとは ?

眼やディスプレイに表示されている「色」は人間が自然に感じるように補正がかかっています。
この補正は「ガンマ補正」と呼ばれ、色空間(Color Space)として「sRGB」というものがよく使用されます。
JPEGやPNGの画像/写真はすでにsRGBがかかった状態のものを見ています。
対して、HDRI(High Dynamic Range Image)の情報を持つexrやhdr形式の画像ファイルは、Linear(リニア、線形)な状態で格納されています。
感覚としては、HDRIに格納されているピクセル情報は色というよりも光の強さに近いでしょうか。
HDRIはペイントツールや3DCGツールで読み込んだときに、自然に見えるようにsRGBに変換された状態で表示されることが多いです。
リニアな色をそのままディスプレイに表示した場合、sRGBの時に比べて少し暗くなったような表示になります。

物理ベースのレンダラの場合は、レンダリング工程ですべての色やテクスチャをリニアに統一してから計算する必要があります。
そして、レンダリング結果を最終的にディスプレイに表示する際に、リニアからsRGBに変換します。

BaseColorのテクスチャをpngやjpegの写真(sRGB)とした場合、リニアに変換された後にレンダラに渡されレンダリング、
最終出力でsRGBに変換されて元の写真の色合い/色空間に戻ることになります。
この一連の流れのことを「リニアワークフロー」と呼びます。

単色(Color)はディスプレイに表示されているものは「sRGB」です。
レンダラに渡す場合はリニアに変換する必要があります。
BaseColorの場合はpngやjpeg画像を採用する場合が多く、これはテクスチャ自身が「sRGB」です。
法線マップ(NormalMap)の場合はテクスチャにベクトルデータを格納している構造のため、色ではありません。
よって、法線マップは「リニア」で扱うことが多いです(そのままレンダリングに渡すことになる)。
Roughness/Metallicマップは「リニア」で扱うことが多いですが、DCCツールによってはsRGBで扱う場合もあるようです。
テクスチャは、テクスチャフォーマットにかかわらず「リニアかsRGBか」というのが選択できるようになっているツールが多いです。

レンダリング工程はリニアで統一、最終的にディスプレイに表示する際にsRGBに変換する、という流れはだいたい決まっているため、
与えるテクスチャや単色がsRGBかリニアか」だけを注意していけばOKな場合が多いかもしれません。

OmniverseのOmniPBRでは、カラースペースをどう扱っているか

OmniverseのOmniPBRの場合は、テクスチャファイルの指定の次に「Color Space」の指定があります。
以下はAlbedo(BaseColor)の場合です。

ここで「auto/raw/sRGB」のいずれかを選べます。
「raw」はリニアの指定になります。この場合はレンダリング時に変換処理を行わずにそのまま渡すことになります。
「sRGB」の場合はそのテクスチャがsRGBとして扱われている、という明示になります。
この場合はレンダリング時にsRGBからリニアに変換されて渡されることになります。

Normal Mapの場合はリニアで扱う必要があるため、Color Spaceは「raw」を指定しています。

Substance Designerでテクスチャが白くなる問題の対策

それでは、Substance Designerに戻ります。
「color_texture」の入力をドラッグすると「texture_2d(<*>,<*>)」というのが選択できます。

これを使うと、Color Spaceの選択をテクスチャ自身で行うことができるようになります。

「gamma_srgb」を選択すると、Substance Designer上のIrayは以下のように正しい色でテクスチャが貼られました。

ただ、このGammaを指定できる「texture_2d(<*>,<*>)」はexposeできません。
元の「texture_2d」に戻し、Exposeした場合にPROPERTIESに「Gamma Type」の指定ができるようになります。

ただ、IrayのプレビューではこのGamma Typeの指定を変えてもテクスチャの色空間は変化しないようでした(バグ?)。

MDLでエクスポートする場合は入力パラメータとしてテクスチャを出したいため、「texture_2d」を使用してExposeして扱うことにしました。

法線マップの指定

BaseColorのテクスチャと同様に、法線マップのテクスチャも指定します。
デフォルトでは以下のようになっていました。

1つ前の「Normal」ノードの入力をドラッグし「normalmap_texture」を探しGraphに追加します。

作成された「normalmap_texture」の入力をドラッグし「texture_2d」をGraphに追加します。

「Normalmap file(texture_2d)」のPROPERTIESで法線マップをリソースから指定します。
また、このノードをExposeしました。

「Gamma Type」を「gamma_linear」としました。

Irayのプレビューは白くなったままですがそのまま進めます。

入力パラメータの識別名(Identifier)と表示名(Display Name)を決める

以上で、Graphは以下のようになりました。

赤いテキストは表示名(Display Name)です。

Expose対象のノードの「Identifier」と「Display Name」を決めていきました。

「In Group」は何も入力していません。

入力パラメータの順番を調整

Graph上の何もないところをダブルクリックし、GraphのパラメータをPROPERTIESに表示します。
「GRAPH INPUTS」で表示順を並べ替えました。

「GRAPH INPUTS」の左端のバーをドラッグすると入れ替えできます。
BaseColor File/NormalMap File/Roughness/Metallic/Specular Levelの順番としました。

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

EXPLORERの「xxx.sbs」を右クリックしてポップアップメニューの「Export MDL Module」を選択して、MDLファイルをエクスポートします。

MDLファイルと一緒にテクスチャも出力されました。

これでSubstance Designerの作業は完了です。

OmniverseにMDLファイルを読み込み

OmniverseへのMDLファイルの読み込みは前回の内容をご参照くださいませ。

読み込んだMDLを割り当てたマテリアルのPropertyで、
Inputsに「BaseColor File」「NormalMap File」が追加されているのを確認できました。

「BaseColor File」の次に「BaseColor File Color Space」というのも追加されています。
デフォルトでは「auto」となるようです。
これを「BaseColor File」はsRGB、「NormalMap File」はrawに変更しました。

光源としてDomeLightだけを指定したシーンは以下のようになりました。

後は、MDLをSubstance Designerで組み合わせていけばマテリアルをカスタマイズしていけるというのが見えてくるかと思います。

MDLの法線マップの指定について (2022/03/18 追記)

MDLの法線マップの指定で、1つ間違いがありました。

"normalmap texture"のoutput(float3)は、"material geometry"のnormal(float3)に接続する必要があるようでした。
"normal"ノードがこの間に挟まっていると、法線マップの各種入力パラメータを追加した場合に反映されなくなってました。

ということで、今回はここまでです。
MDLのテクスチャの指定とリニアワークフローについてでした。
次回は、MDLをカスタマイズしていきます。