確認環境 :
OS : Windows 11
MaterialX 1.39.1
kit-app-template : Omniverse USD Composer (Kit 106.5)
MaterialXのShaderの規模が大きくなってきた場合、機能ごとにmtlxファイルに分けておきたいです。
今回はMaterialXのマテリアル表現を複数のmtlxファイルに分けて管理する方法について書いていきます。
MaterialX: Supplemental Notes にこのヒントが書かれています。
以下のように"
"という記述を行うことにより、別のmtlxファイルを参照することができるようでした。<xi:include href="xxxx.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ファイルのように結合された状態で読み込まれるようでした。