2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Maya - Bifrost+USDとLookdevXでシェーダー表現

Last updated at Posted at 2025-12-24

はじめに

どうも今年は色々と年末にかけて急激に多忙になり、
もう記事投稿できないんじゃないかと思いましたあまぐりです

この記事は Maya Advent Calender 2025 の12/20の記事予定だったものです(大遅刻しました・・・)

去年の記事で軽く触れていたmaya-hydraのプラグインが2026.3よりテスト実装されましたので今年はそれに軽く触れつつも、とりあえずMaya内でUSDとBifrost、そしてUSDを使う場合LookDevXが組み合わせられるということでそれの小ネタを残せればと思います

ご注意

本記事で取り扱う内容にはテクノロジープレビューのものであったり、筆者の知識不足で意図せずMayaシーン内に不具合が出る可能性がございますので予めご注意ください

maya-hydraってなに?

maya-hydraとはPixer社がオープンソースで提供を行っているOpenUSDのシーン描画システム「Hydra」を利用したMaya用のプラグインです

これはMayaの既存シーン描画システムであるViewport2.0を置き換える予定のもので、
既存データに加え、USDシーンも扱える描画システムにするものです

viewport2.0がhydraってのになるとどうなるの?

OpenUSDのhydra描画システムはリアルタイムレンダリング向けに「Storm」というレンダラーを内包しています

上記リンク内にもありますが、このStromレンダラー自体はHoudiniをご利用の皆様方には馴染み深い名前だとおもいます

でこのStromレンダラーはOpenGL、Metal、VulkanグラフィックスAPIをサポートしています

MetalはいわずもがなMacOS用の描画APIです、そしてVulkanはOpenGL同様マルチOSに対応してくれています

ただOpenGLとの違いとしてはOpenGLがGLSLしかシェーダー言語を受け付けていないのにたいして、Vulkanは直接的にHLSLやGLSLといったシェーダー言語を扱っておらず中間表現を扱うのですが、その中間表現の言語へはHLSLからも利用できるとあります

つまり各自得意なシェーダー言語似合わせてMaya立ち上げ時、DirextXだとかOpenGLだとか描画APIを切り替える必要なくてそこはまぁいい感じになっていけそうなわけですね

環境構築する側のひとにとってもいままでの知見を捨てずにモダンAPIが扱えるならメリットも多いのではないかと思います

とはいえ現在のMaya-hydraはgithubを見る限りではOpenGLオンリーのようです

今回の遊び環境

Maya 2026.3

2026.3でないとMaya Hydraのテクノロジープレビューが実行できませんのでその点ご注意ください

hydraとstormはさておきMayaでUSDをノーコードで遊んでいこうぜ

というわけでデザイナーに馴染みのない話はさておき、早速USDとBifrostの話題です

MayaでUSDというなんかモダンなやつをカジュアルに覚えなきゃなぁという勢いで「USD Layer Editor」というさっそく実装されたものを使いシーンをあれこれいじるとややちょっと馴染みのない工程をしなければなりません

・USDに一度保存するといちいち再読み込みからのMaya用に変換してからしか再度保存できない
・というよりMaya上での編集の工程が複雑
・そもそもレイヤーってなんやねん

ちょっと色々ためしたいけどいろんなことを試すたびにシーンを開き直し、保存してから読み込んで・・・というお困りの私や皆さま

Bifrostに入ったUSD扱うノードの出番です
BifostUSDを使っていきましょう

BifrostでUSD遊ぼうぜ

Bifrostを使うともうちょっとめんどくささが軽減されます

・Mayaの1シーンだけで複数のusdファイルを扱いやすくなる
・USDシーンの編集状態がわかりやすくなる

.usdファイルの作成と保存

Maya-Bifrostを使った.usdファイルの作成は一番簡潔にすると以下になります

遷移:

  1. create_usd_stageノードでUSDステージを作成
  2. create_usd_stageノードのstageポートをsave_usd_stageノードのstageにつなぎ、USDステージを.usdへ保存
  3. save_usd_stageノードのout_stageポートをoutputノードへ接続

image.png

Bifrostはoutputノードへ接続しないと評価(実行)されず、繋ぐとリアルタイムで反映されます

CreateStageするusdファイルのパスは絶対パスでない場合Mayaの実行ディレクトリ直下に.usdが保存されてしまうので、
とりあえずどこかしら絶対パスで指定しておきましょう

また空のシーンだと味気ないのでちょっとテスト的にメッシュがたまたまシーン内にありますので、それをUSDで扱うためにファイル保存してみます

遷移:

  1. USDステージの作成
  2. define_usd_meshノードを作成
  3. add_to_stageノードを作成
  4. Maya内のMeshShapeのOutMeshをBifrostGraphにinputノードへ作成したportを接続
    a. ノードエディタで接続しよう
  5. 接続したinputのport(都合によってmeshという名前に変えておく)から define_usd_meshのmeshポートへ接続
  6. define_usd_meshノードのmesh_definitionポートをadd_to_stageノードのprim_difinitionsポートへ接続
  7. USDステージを.usdへ保存
  8. save_usd_stageノードのout_stageポートをoutputノードへ接続

image.png

どちらもoutputに接続することでMayaシーン内にも結果がUSD Layer Editorで読み込んだ時のようにシーン上でも結果を確認できるようになります

image.png

というよりBifrostでUSDステージをoutputすることで自動でUSD Layer Editor側にも結果が反映されます

この状態になるならば、MayaのLookDevX(MaterialXの編集機能)でマテリアルをいじれるということです

で、ここからマテリアルやらを作っていくんですが最終的にすごく重くなりましたので、
メッシュはメッシュ、マテリアルはマテリアルをそれぞれusdファイルに保存するグラフを作成していきます

モデルステージを読み込んだマテリアルを編集するためのステージを作成する

ということでマテリアルを追加したり、メッシュへのバインドをテストしたりするステージを作っちゃいますが、

その前に

Bifrostグラフの実行管理 - メッシュ用のUSDStage編集グラフを停止する

Bifrostで毎フレームメッシュステージが保存されちゃうのは良くないのでSaveStageのEnableをfalseに切り替えて

そしてBifrost Graph EditorのEdit>Pause Graph Executionを実行してグラフ実行とコンパイルを停止しておきます

image.png

グラフビューの右上にPausedと表示されていれば実行が停止されます

image.png

停止されるとMayaシーン内にUSDのProxyノードは残りますがUSDシーン情報は消えてくれるため邪魔にもなりません
再度実行するとUSDシーンがMayaシーンにも反映されます

マテリアルステージ作成

次にメッシュステージ同様にマテリアルステージを作成していきますが、ここでも作成を実行するグラフの管理が大変になるのでBifrost Graph EditorからnewGprahを作って作業をします

CreateUSDSatgeノードを作成します
このときCreateUSDStageはサブレイヤー(別のusdファイルにあるステージや要素を参照としてもてる機能)を受付けます

サブレイヤーはUSDLayer型を刺す必要があり、USDStage型のプラグをそのまま挿すことはできませんので、先程作成したメッシュのStageをOpenUSDLayerで取得して、それをサブレイヤーに刺します

あとは画像にもありますが、Scopeと呼ばれる各要素をシーン内にまとめておけるコンテナを使ってマテリアルが追加されるパスを整理します

  1. /materialというパスでScopeをDefineします
  2. Define PreviewMaterialというノードがあるのでそれを追加します
  3. どちらもAdd to Stageノードでステージへ追加します
  4. これは一応やらなくてもいけてるんですがお作法としてこのステージでのdefaultPrimを/materialに設定します
  5. Save Stageノードで.usdファイルをセーブします

image.png

画像ではSave Stageノードの先をoutputにつなげていませんが、初回だけセーブするため繋いで保存状態を確認できたら外します

これでモデルの更新を随時うけいれつつ、マテリアルだけを編集できるステージが作成できました
あとはメッシュステージ同様マテリアルの作成グラフも停止しておきましょう

マテリアルステージでメッシュとマテリアルをいじろう

ここから先は既にある.usdファイルの編集になります

ここでも新たにBifrostのグラフを作成しておきます
image.png

そしてその新しいグラフ内で

  1. 先程作成したマテリアルステージ(.usdファイル)をOpen USD Stageノードを作成し、ロードします
  2. 一旦SaveStageノードを新たに作成します
  3. SaveStageノードからBifrostのoutputへ刺します

image.png

そうするとアウトライナーでもマテリアルステージで読み込んでいるメッシュステージの内容も取り込んだ状態で読み込まれていることがわかります

メッシュにマテリアルをバインドする

  1. Open USD Stageから出ているsatgeの先にbind_materialノードを作成し、そのstageへつなぎます
  2. bind_materialノードのPrimPathとMaterial PathにそれぞれメッシュのPrimPathとマテリアルのPrimPathを入力します
    a. 便利なのはアウトライナで目的のPrimを選択し、アトリビュートエディタのMetadata内のPrimPathからのコピーです
    image.png
  3. bind_materialノードのout_stageをBifrostのoutputにつなぎます

image.png

そうするとMayaのビューポート上でも作成したマテリアルのカラーが反映されることを確認できます

メッシュデータを編集する

これだけでは面白みがありませんので、メッシュの頂点カラーを編集します

今回シェーディング表示したいのはメッシュに対して別の平面メッシュを用意して、
その平面メッシュの上側にある頂点のカラーをかえて描画するというシンプルなものです

image.png

グラフでは以下を構築しました

  1. 平面判定用のPlaneの作成

  2. BifrostグラフにPlaneXformポートを作成(Matrix4x4)

  3. ノードエディタでPlaneのWorldMatrixからBifrostグラフのPlaneXformプラグへ接続

  4. USDStageからモデルレイヤー内にあるメッシュプリムを取得

  5. get_usd_geom_pointsでメッシュのジオメトリ頂点配列を取得

  6. 頂点配列数を調べ、create_primvarでその配列数と同じ配列数を持つprimvars:displayColorを作成
    a. image.png

  7. 並行してその配列を回し、平面より上に頂点が存在するかの判定処理を作成

  8. 平面より上に存在する頂点座標のカラーを赤(1.0, 0.0, 0.0)にしたものでdisplayColorをセット
    a. image.png

グラフは以下のように構築しました
image.png

createDisplayColorAttrの中身です
image.png

こちらfor_each内
image.png
平面より上にあるかどうかは純粋に平面トランスフォームマトリクスのクオータニオンから法線を割り出し、その法線と平面中心と頂点のなすベクトルの角度の内積の符号から求めるシンプルなものです

ちょっと時間がなくて簡単なもので申し訳ありませんが、さくっとできるの逆によしとします

これで一番最初のメッシュステージに保存するメッシュを差し替えても、プロシージャルにシェーディング結果を反映できるようになりました

マテリアルをいじる

マテリアル作成のステージではただPreviewMSurfaceマテリアルを定義したにすぎず、このままではビューポート上にはマテリアルのカラーがそのままでてしまいますのでシェーダーの内容を加工します

Mayaのアウトライナからマテリアルを選択してLookDevXで開きます

image.png
image.png
するとLookDevXのビューにマテリアルが表示されていますのでダブルクリックしてグラフの中へさらに入ります

image.png
このような画面になるはずです

image.png
この状態で次にUSD Primvar Reader(Primvar)を作成します

image.png
USD Primvar ReaderのNodeTypeを「vector3」に変更し、Varnameを「displayColor」にします

USDファイル内ではDisplayColorはcolor3fという型なのですが、以下のドキュメントにもある通り、color3fの中身はfloat3です

するとBifrostで構築した頂点カラー通りに描画されました
image.png

すごく重い

とはいえ使ったモデルが頂点数が多く重いので軽いモデルに差し替えます

メッシュを差し替えるために一度マテリアル編集グラフは停止しておきましょう

image.png

createMeshShapeというBifrostGraphは最初に作成したメッシュステージの作成用グラフです
そこのinputにあるmeshポートへ今度は軽いキューブメッシュを刺し、グラフのoutputをつなぎ直したらグラフを実行してメッシュの保存しなおしを行います

bifrost_shade_04.gif

なにか地雷を踏んだのかいじっているとMayaが強制終了しましたが、
メッシュを差し替えても動的にシェーディングできていることが確認できました

高速化?

USDいじっているのに既存のMayaのビューポートで描画するのは無理があったようです

ここでhydraの出番です

image.png

bifrost_shade_05.gif

とても高速(?)に描画されました!

余談

とはいえやはり頂点数が多いとStormに切り替えても重いものは重いようでした・・・・
PCのスペック不足もあると思います・・・・

本当の意味での高速化はまた別途機会をみつけてボトルネックを探してみたいと思います

とはいえ今回テストで使ったモデルがそもそも7万1千も頂点があるので高速に処理しようとするのが結構無理がある気がしていますが、なにかより良い方法あるんじゃないかって気はしているので根気よく探してみたいと思います

まとめ

今回はUSDフレームワークのリアルタイムレンダラーであるstormがMayaにくるらしいという紹介と、MayaのBifrostを使ってUSDファイルを作る方法やシェーディングをちょっと遊んでみたでした

MayaでもUSDをプロシージャルにいじってみたいぞ!という方のご参考になれば幸いです

それでは皆様良いお年を!!!

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?