はじめに
この記事は 2025年末のMaya AdventCalender2025の記事を補間するものです
ちゃんとした高速化
去年の記事では高速化?という、自身でコントロールできる範囲外のもので実際高速偽装する内容を取り上げましたが
USDかどうかによらずより高速化できるものに任せたほうが早いよね?って言う部分をちゃんとそいつに任せようとした試みをこの記事で取り上げたいと思います
着眼点
まず件の記事では執筆時間のなさからBifrostGraph上ですべての頂点処理を行っていました
これはいただけないです
頂点のように可変かつ無数に来る可能性がある処理対象を並列化してとしてもCPUで全部やる(処理する)のは重いのは当然です
ここを多数の処理対象に計算結果を個別にかける前提の計算を得意とするものにできるだけまかせていく方針をとると高速化できるよねという従来の描画方針をMaya+Bifrost+LookDevXでもとろうぜというのが今回の趣旨です
前提条件の確認
シェーダーで赤色にするピクセルの判定
・ある平面の上面(表面より上)に位置する頂点
シェーダーで黒色にするピクセルの判定
・ある平面の下面(表面より下)に位置する頂点
前回の記事の偽高速化部分
色分けする平面の表面法線と、実際にシェーディングするモデルの頂点座標との計算をすべてBifrost上で行っていました
ただしこれは、Bifrostで(最適化観点で)やるべきでないことまでやっていたために、高速化にいたっていませんでした
件の記事の描画を高速化しようMayaで...
というわけでさっそく色分けの実装のうちCPUでしかやれないことだけをBifrostに、
GPUでやったほうがええやん(コーディングを必要としてしまう要素、ComputeShaderを別途実装したくないので)という部分をシェーダー側の計算にしていきます
Bifrost側の実装
解説
さすがに今回の色分けする平面と、色分け対象となるモデルが複数ある場合に、
シェーダー内で全てのモデルに対して色分けする平面の法線をGPU計算上で更新するのは事実上不可能なので残します
と思いましたがMaya2024以降であればExtraAttributeとの組み合わせでも、そもそもできるかもしれない
ここでやっているのはusdにシェーダーで読み込めるように追加のカスタムprimvarを2つ追加しています
- 色分けする平面の「現在の」上面法線の正規化したベクトル情報(primvar:plq)
- 色分けする平面の「現在の」上面法線を割り出した中心座標(primvar:plt)
MaterialX側の実装
LookDevX(MaterialX)のシェーダーは、usd内メッシュの情報からprimvar:plq,primvar:pltの両方を読み込み、各頂点の座標とplt座標をなすベクトルとplqの法線とを見比べて表裏どこに頂点がいるかを計算します
描画結果
CPUとGPUの役割を明確化するとMayaのビューポートをhydra GLにしたうえであれば、上添付GIFのように高速に色分け描画できます
Gifのモデルは7万頂点あるモデルです
結果から
単なる高速化というと語弊があります
まずBifrostとLookDevX(materialX)の構成がめっちゃくちゃシンプル化します
つまり、影響を与える側と与えられる側の関係性をbifrostで、
影響を与えられる側が描画であるならlookDevXでと切り分けが容易になっています
いわゆるゲームなどリアルタイムなメッシュ描画において、異なるオブジェクト同士の関係性を
なんらかの法則に基づいて見比べた上での描画を行うのはこれまでビューポート上では結構プラグイン足したりしなければならかなったことが、bifrostを使うと追加プラグインなしで実装できるのがかなりいいメリットだと感じている次第です
今回のbifrostの使い方の肝は、単一のメッシュ内のシェーディングの操作ではなく、
外部要因が関係してくるシェーディングにおいて、実際にビューポート上に追加拡張なしで描画できるじゃんというのが一番大きかったなぁとおもっています
最後に
まぁあたりまえやなぁ・・・ということもいえるのですが
USDを交えるとMayaの標準機能だけでも比較的簡単に完結できることが増えたことは喜ばしいです
ただし実務で使おうとすると、色々あって現行プロジェクト等にこういったものをスムーズに導入できないのが現状ではありますが・・・
それでも追加プラグイン等の開発なしでいろいろ表現できるようになっているのは嬉しいですね


