[MaterialX] [Omniverse] 複数のmtlxファイルを組み合わせる (include)

  • by

確認環境 :
OS : Windows 11
MaterialX 1.39.1
kit-app-template : Omniverse USD Composer (Kit 106.5)

MaterialXのShaderの規模が大きくなってきた場合、機能ごとにmtlxファイルに分けておきたいです。
今回はMaterialXのマテリアル表現を複数のmtlxファイルに分けて管理する方法について書いていきます。

MaterialX: Supplemental Notes にこのヒントが書かれています。

https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/documents/Specification/MaterialX.Supplement.md#examples

例 :
https://github.com/AcademySoftwareFoundation/MaterialX/tree/main/javascript/MaterialXTest/data/includes

以下のように"<xi:include href="xxxx.mtlx" />"という記述を行うことにより、別のmtlxファイルを参照することができるようでした。

<?xml version="1.0"?>
<materialx version="1.39" colorspace="lin_rec709">
  <xi:include href="xxxx.mtlx" />

</materialx>

例えば、以下のような2つのmtlxファイルはsubNode.mtlxをroot.mtlxで呼び出しています。

root.mtlx

<?xml version="1.0"?>
<materialx version="1.39" colorspace="lin_rec709">
  <xi:include href="subNode.mtlx" />

  <surfacematerial name="TestMat" type="material" xpos="7.855072" ypos="0.353448">
    <input name="surfaceshader" type="surfaceshader" nodename="open_pbr_surface_surfaceshader" />
  </surfacematerial>
  <open_pbr_surface name="open_pbr_surface_surfaceshader" type="surfaceshader" xpos="5.579710" ypos="0.767241">
    <input name="base_color" type="color3" nodename="multiply_color3" />
  </open_pbr_surface>
</materialx>

subNode.mtlx

<?xml version="1.0"?>
<materialx version="1.39" colorspace="lin_rec709">
  <constant name="constant_color3" type="color3" xpos="5.420290" ypos="-1.310345">
    <input name="value" type="color3" value="0.79902, 0.082252, 0.082252" />
  </constant>
  <constant name="constant_color4" type="color3" xpos="5.420290" ypos="-0.344828">
    <input name="value" type="color3" value="0.115725, 0.115725, 0.843137" />
  </constant>
  <multiply name="multiply_color3" type="color3" xpos="6.811594" ypos="-0.620690">
    <input name="in1" type="color3" nodename="constant_color3" />
    <input name="in2" type="color3" nodename="constant_color4" />
  </multiply>
</materialx>

参照するノード名が同じであれば、外部のmtlxファイルがつながっていると見て複数のmtlxファイルに分けて管理できそうです。
MaterialX Graph Editor上では xi:include タグは指定できないようだったので、テキストエディタ側で編集しました。

MaterialX Graph Editorでは、root.mtlxを読み込めばinclude指定されたmtlxファイルも呼び出されるようです。
ただし編集して保存しても反映されませんでした。

Omniverseでxi:includeを使ったMaterialXを読み込む

Omniverse(USD Composer)にこのMaterialXの構造を読み込む場合、
ルートのmtlxファイル(ここではroot.mtlx)をStageにインポートすれば1つのMaterialXファイルのように結合された状態で読み込まれるようでした。