メインコンテンツまでスキップ

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 周りの基礎知識が必要だなと感じたので
継続的に学習していきたいと思います。