まずは下記記事をご一読ください。
SolarisでMaterialXファイルを保存して、再利用する
さて、ここでなぜmtlx imageがそのままだと出力できないのか?
今回も一番下にサンプルファイルがあります。
MaterialXとして出力するには、Pattern shadersがノードグラフ内に配置されることを必要とします。このPattern Shadersとは、出力がプレーンなデータ型(float, vector3など)であるものです。つまり、非シェーダタイプです。
HoudiniはUSDライブラリ(ファイルフォーマットプラグイン)を使用して.mtlxファイルを読み込むため、.mtlxファイルはUSD実装の前提条件を満たしている必要があります。
例えば、パターンシェーダはノードグラフ(サブネット)にある必要があり、ターミナルシェーダ(例えば、Surface、Volume、またはDisplacementマテリアルSHADER)はmtlx surface,、ボリューム、またはdisplacement にフィードする必要があります。
確かにSubnetにまとめずにそのまま出力すると
<input name="base_color" type="color3" nodename="mtlximage1" value="0.8, 0.8, 0.8" />
.
<image name="mtlximage1" type="color3">
<input name="texcoord" type="vector2" nodename="mtlxtexcoord1" value="0, 0" />
<input name="file" type="filename" value="C:/temp/houdini/USD/A_Beautiful_Game_No_Cache/A Beautiful Game No Cache/Textures/King Textures/King Black Textured/DefaultMaterial_Base_color_1001.png" />
<input name="layer" type="string" value="" />
<input name="default" type="color3" value="0, 0, 0" />
<input name="uaddressmode" type="string" value="periodic" />
<input name="vaddressmode" type="string" value="periodic" />
<input name="filtertype" type="string" value="linear" />
<input name="framerange" type="string" value="" />
<input name="frameoffset" type="integer" value="0" />
<input name="frameendaction" type="string" value="constant" />
</image>
それに対し、Subnetにいれて出力すると
<input name="base_color" type="color3" nodegraph="NG_subnet1_color3_float_float_float" output="out" value="0.8, 0.8, 0.8" />
<nodegraph name="NG_subnet1_color3_float_float_float">
<image name="image1" type="color3">
<input name="file" type="filename" value="C:/temp/houdini/USD/A_Beautiful_Game_No_Cache/A Beautiful Game No Cache/Textures/King Textures/King White Textures/DefaultMaterial_Base_color_1001.png" />
<input name="layer" type="string" value="" />
<input name="default" type="color3" value="0, 0, 0" />
<input name="texcoord" type="vector2" value="0, 0" />
<input name="uaddressmode" type="string" value="periodic" />
<input name="vaddressmode" type="string" value="periodic" />
<input name="filtertype" type="string" value="linear" />
<input name="framerange" type="string" value="" />
<input name="frameoffset" type="integer" value="0" />
<input name="frameendaction" type="string" value="constant" />
</image>
<output name="out" type="color3" nodename="image1" />
とnodegraphがしっかり記述されます。
正しく読み込むにはここが必要ということになります。
次はPyroに割り当てるマテリアルをMaterialXで作成してみます。
このままmtlxvolumematerial1を右クリックからSave MaterialXを行うと下記のように出力します。先ほど同様nodenameしか出力できていません。
<volume name="MTLX_VOLUME" type="volumeshader">
<input name="vdf" type="VDF" nodename="mtlxanisotropic_vdf1" value="" />
<input name="edf" type="EDF" nodename="mtlxconical_edf1" value="" />
</volume>
そこで下記のようにノードグラフ(Subnet)に収納し、出力
この状態で出力すると
<volume name="MTLX_VOLUME" type="volumeshader">
<input name="vdf" type="VDF" nodegraph="NG_subnet1_VDF_EDF" output="out" value="" />
<input name="edf" type="EDF" nodegraph="NG_subnet1_VDF_EDF" output="out_2" value="" />
</volume>
として、nodegraphとして出力することができました。
これで出力したMaterialXファイルをリファレンスして割り当てると
やった!ちゃんと割り当てることができました。
ご参考になれば幸いです。