MayaUSDでマテリアルを扱おう
MayaUSD の基本、Bifrost など見てきましたが MayaUSD の基本編最後は「マテリアル」です。
以前は、マテリアルアサインもろくにできないような惨状でしたが
2025 では一通りの作業ができるようになっていたので、順番に見ていきます。
今回は MaterialX でのマテリアルの作り方などには触れません。
あくまでも Maya + USD でどのように扱われているかを詳しく調べる回になりますので
ご注意ください!!
シンプルなマテリアル作成・アサイン
まず、最も基本的な手順を見ていきます。
あらかじめ、UsdProxyShape を作成し、Sphere を作成しておきます。
作成方法は、Maya 世界で Sphere を作り
選択> Duplicate As USD Data で、送りたい USD 世界を選択します。
そのあと、Sphere を選び「Assign New Material」から USD > USD Preview Surface
を選択します。
これで、USD の世界に PreviewSurface の Material/Shader が作成されました。
作成した Shader を選ぶと(Material ではない)
このように AttributeEditor で、マテリアルを編集することができます。
DiffuseColor を赤にすると、
このようにマテリアルがアサインされていることが確認できます。
おおむね、これまでの Maya での 作業と同じ感覚でマテリアルを作成・アサインできるようになっています。
LookDevX
シンプルなものであれば以上で終了なのですが、実際にはもう少しちゃんとマテリアルを設定したくなるはずです。
そうした場合は、これまでの HyperShade とは別のツールで「LookDevX」と呼ばれる
USD と MaterialX のシェードグラフを作成するツールを使用します。
>> LookdevX について
まず、LookdeVX を開きます。
開くとこのような画面になります。
まずは USD で作成してみます。
「USD」ボタンを押して、編集画面に入ると、
Tab > USD > USD Preview Surface を選択します。
すると、このように PreviewSurface のマテリアルノードが作成されます。
作成した PreviewSurafce は、自動的に現在の MayaUsdProxyShape に Material/Shader を作成します。
Material ノードをダブルクリックすると、ノードの編集 UI に入ることができます。
この中は、いわゆる UsdShadeShader ノードで構成されていて
この中でテクスチャを定義したりなど、USD でマテリアルネットワークを
作成できます。
まずは簡単なマテリアルということで、Texture をアサインしてみます。
その場合は USD UV Texture を選びます。
選ぶと、UsdPrimvarReader と UsdUVTexture が自動で作成され(PrimvarReader はもろもろ指定もされた状態)
一応できましたが、Maya のビューポート(Hydra)だと微妙な壊れ方をするし
Arnold にすると Maya が 100%落ちます。
がんばれ!!Maya!!!
Houdini で見ると正しくアサインできているので、おそらく大丈夫だと思います。
すでにある PreviewSurface を編集したい場合は、
対象の Material を選び Show in LookdevX で開くことができます。
MaterialX
ここまでは USD の世界だけでしたが、LookDevX は USD というよりどちらかというと
MaterialX を使用するのがメインなのではないかと思います。
MateiralX がなにかというと
シェーディングネットワークを記述するためのオープンソース規格です 参考: https://www.sidefx.com/ja/docs/houdini/solaris/materialx.html
とあるとおり、シェーディングネットワークを記述するための形式です。
https://openusd.org/release/api/usd_mtlx_page_front.html
USD には、MaterialX を USD で読むための FileFormatPlugin が用意されているので
USD とは別のシステムではありますが、USD とセットで語られがちです。
くわしくは、あたりで USD と MaterialX は書いてありますのでこちらを参照してください。
まず、作成から MaterialX Stack を選び作成します。
これは、USD における mayaUsdProxyShape と同じようなものの MaterialX 版で
「このノード以下が MaterialX の世 界」になります。
※このノードは、LookdevX プラグインの仕様らしい※
アウトライナー上にはこのように表示されます。
まず、さすがに何もないとわからないので MaterialX のサンプルを読み込んでみます。
https://matlib.gpuopen.com/main/materials/all
使用するサンプルは、AMD の GPUOpen MaterialX Library です。
このサンプルを Maya のシーンの MaterialXStack に読み込みます。
まず、Create MaterialX Document で、Document を作成します。
MaterialX の Document とは、ファイル全体のルートノードを表すオブジェクトです。
なので、まずはこの Document を作成する必要があります。
Document のノードを選び、Create MaterialX Document を選びます。
選ぶと、このように materialXStack にインポートできます。
これを LookDevX で開くとこのようになっています。
NG_Oblong_Indigo_Wallpaper 内はこのようになっています。
materialXStack でみたときの親子関係=ノードでまとめられている単位になっているようです。
LookdevX で表示できましたが、これだけだと MaterialX の世界でだけマテリアルが存在している状態になっているので
このままだと使用できません。
さらに、どうやらマテリアル単体でのコンバート(Duplicate As USD Data はあるけれども、空の Prim が作られるだけで使えない?)
ということにここまで書いて気が付きました。なんてこった。
さすがにあんまりなので、単体で持って行く以外の方法を考えます。
この MaterialXStack にあるものは、USD の世界ではなく Maya 世界の Mesh に対して
アサインが可能です。
Assign Existing Material に MaterialXStack にある StandardSurface が表示されているので、これを選びます。
結果、これまでのマテリアルと同様に ShadingEngine 経由でマテリアルがアサインされます。
この MaterialX の StandardSurface をアサインした Mesh を
Duplicate As USD Data で USD の世界に送ります。
Options...に「MaterialX Shading」のチェックがあるので、これを ON にしておきます。
結果、USD の世界にインポートすることができました。
ただ、見ての通りすべてのノードがインポートできるわけではない
(USD の FileFormatPlugin のドキュメントなどにも制限事項が書かれている)
ので、その点だけ注意が必要です。
さらに、どうやらエラーになっているので、まだまだこの辺りは検証が必要そうです。
MaterialX 自体の仕様もちゃんと理解しないとダメそうなので
この辺りは次の宿題にしたいと思います。
まとめ
ネイティブ USD と MaterialX をノードベースで編集できる機能である LookDevX ですが
おそらく 1 からマテリアルを作る場合などは大丈夫かもしれませんが
既存の mtlx を持ってきたり、USD と合わせていろいろやると途端に怪しくなる気がします。
とくに MaterialXStack 側(MaterialX の世界)と MayaUsdProxyShape 側(USD の世界)
と Maya の世界とが平行で「ノード」という形でラップして存在しているので
どこがどうつながっていて、どうやって出力するのかがわかりにくいです。
このあたりは、もうすこし MaterialX や OpenPBR 周りの基礎知識が必要だなと感じたので
継続的に学習していきたいと思います。