[Omniverse] MaterialXを使う

  • by

Omniverse Create 2022.3以降では"MaterialX"を使ったマテリアルを使用できます。
ここではOmniverse Create 2022.3.1を使用しました。

MaterialXとは ?

以下がMaterialXの公式サイトです。
https://materialx.org/index.html

仕様やサンプルなどがあります。
USDではUsdPreviewSurfaceのマテリアルの種類がありますが、Shaderをカスタマイズしたい場合はMaterialXを使用できます。
Shaderというよりも、Node Graph(ノードベースでのマテリアルの構築)が近いのかもしれません。
MaterialXはOmniverseのMDLに近い存在です。
カスタマイズしてマテリアル表現をよりリッチにする感じですかね。
Omniverse以外の環境とUSDファイルをやり取りする場合は、UsdPreviewSurface以外のマテリアルの表現手段としてMaterialXを使うほうが互換性を保ちやすくなると思われます(USDがMaterialXを標準的にサポートしているため)。

OmniverseでMaterialXはいつサポートされた ?

以下より、「Create 2022.3.0 Beta」でMaterialXの".mtlx material documents"の読み込みに対応したようです。
https://docs.omniverse.nvidia.com/app_create/app_create/release-notes/2022_3_0.html

ここでの".mtlx material documents"は、拡張子が"mtlx"のテキストファイルを指します。
ここにマテリアルのShader情報を記述します。

mtlxファイル

参考として、MaterialXで用意されているGitHubのサンプルが役に立ちそうです。

Example MaterialX Files
https://materialx.org/DeveloperReference.html#ExampleCode

MaterialXの"Standard Surface"のサンプルとして
"standard_surface_plastic.mtlx"はまずはじめに見ると分かりやすいです。

https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/resources/Materials/Examples/StandardSurface/standard_surface_plastic.mtlx

以下のような内容になっています。

<?xml version="1.0"?>
<materialx version="1.38" colorspace="lin_rec709">
  <standard_surface name="SR_plastic" type="surfaceshader">
    <input name="base" type="float" value="1" />
    <input name="base_color" type="color3" value="0.10470402, 0.24188282, 0.81800002" />
    <input name="specular_roughness" type="float" value="0.32467532157897949" />
  </standard_surface>
  <surfacematerial name="Plastic" type="material">
    <input name="surfaceshader" type="surfaceshader" nodename="SR_plastic" />
  </surfacematerial>
</materialx>

これを"standard_surface_plastic.mtlx"のファイル名で保存しておいてください。

これはMaterialXのドキュメントを読まなくても分かりやすいですね。
"standard_surface"というノードにBase Color(色)とRoughnessを指定、
"surfacematerial"に対して、"SR_plastic"名のノードをつないでいます。
Node Graphでつないでいく感じですね。

これをOmniverse Createに読み込んでみます。

Omniverse Createでmtlxファイルを認識させる

Omniverse Create 2022.3.1を使用しました。
mtlxファイルをReferenceとして読み込みます。
メインメニューの「File」-「Add Reference」を選択し、mtlxファイルをインポートします。

実際はPayloadでも同様のことが可能です。

ファイル名と同じ"standard_surface_plastic"のPrimがStageに追加されました。

この段階ではまだMaterialXのマテリアルとしては認識されていないです。
Stageウィンドウで"standard_surface_plastic"を選択し、Propertyウィンドウを開きます。
Referencesの"Asset Path"にmtlxファイルのパスが入っているのが確認できます。

"Prim Path"に"/MaterialX"と入力してEnterキーを押します。

これで、"standard_surface_plastic"のPrim内にノード情報が表示されました。
"/World/standard_surface_plastic/Materials/Plastic"がPlastic名のマテリアルのPrimパスになります。

MeshにMaterialXのマテリアルを割り当てる

後は、OmniPBRやOmniSurfaceと同じようにMaterialXのマテリアルを使用できます。
MeshのSphereを配置して、MaterialXのマテリアルを割り当ててみました。

初回はマテリアルのコンパイルが行われ、以下のようにマテリアルが割り当てられました。

usdaでのmtlxの記載を確認する

usdaファイルでは、このMaterialXのmtlxファイルはどのように記載されてるでしょうか。
usdaファイルに保存してテキストエディタで見てみました。
不要なものを省いて要点となる箇所だけ書いています。

def Xform "World"
{
    def "standard_surface_plastic" (
        prepend references = @./standard_surface_plastic.mtlx@</MaterialX>
    )
    {
    }
}

Referenceとして"standard_surface_plastic.mtlx"を指定し、</MaterialX> の指定でPrim Pathの指定を行っています。
これによりMaterialXとして認識できていました。

これは、 https://wiki.aswf.io/pages/viewpage.action?pageId=22286781 より"usd_mtlx_example.usda.txt"の中身を見て書き方を学びました。

以下のように配列の形でmtlxファイルを記述することもできます。

def Xform "World"
{
    def "MaterialX" (
        references = [
            @./standard_surface_plastic.mtlx@</MaterialX>,
            @./standard_surface_glass.mtlx@</MaterialX>
        ]
    )
    {
    }
}


これは、Referenceを指定するPrimのPropertyで"Add Reference"で追加していくことができます。
usdaファイルを直接書き換える必要はありません。

こんな感じで、まずはmtlxファイルをOmniverse Createで認識できるのを確認しました。
GitHubの https://github.com/AcademySoftwareFoundation/MaterialX/tree/main/resources/Materials/Examples/StandardSurface から"standard_surface_glass.mtlx"も読み込んでみました。

ただし、Glass表現は"RTX Interactive (Path-Tracing)"である必要があるようです。
MaterialXはMathでの演算もできると思うので、後々もう少し掘ってみることにします。