OpenExec の紹介(2025年4月時点)

OpenUSD についにマージされた OpenExec。そこで OpenExec とは何かについて概要をまとめた

#openusd #openexec
目次

1. はじめに

本記事は、2025年4月にOpenUSD devブランチにマージされた OpenExec の情報をまとめたものである。読者には OpenUSD についての基礎知識があることを前提とする。OpenExec浜田マージされたばかりであり、その開発フェーズは初期段階であることに留意されたい。本記事で述べることも 2025年4月時点のものであり今後変更される可能性がおおいにある。また、OpenExec自体はOut of boxなものではなく、OpenUSDの一部として提供される基盤技術であり、これ単独でなにかを成すために供用されるものではないことにも注意されたい。

OpenExec とはもともと Pixar が開発しているプロプライエタリなDCCツールである Presto の中核である評価エンジンとして開発されてきた技術であり、その評価エンジンを 現在のOpenUSDへの搭載を企図したものである。USDに静的なシーン記述 だけでなく 動的な計算された値をもたらすものである。曰く、

  • 汎用的な計算を行うためのエンジンであり
  • 依存関係の解決を行い
  • データフローグラフに基づき
  • 疎な無効化 (必要な箇所のみを再計算行う仕組みのこと, Sparse Invalidation)をおこなうことで

最適な演算を効率的に行うことができる、としている

OpenExec についてはまだまだ情報が少ないが、本稿ではPixar の技術者が公開している資料、およびマージされたコードを元に、OpenExec の概要をまとめていく。

2. 資料リンク

この記事では、以下の資料、及びコードを参考にしている。

賢明なる読者は、上記の資料を NotebookLM に読み込ませ、理解の一助とすることができるだろう (この記事読むより早いんじゃないかな)

3. OpenExec の概要

https://openusd.org/files/BOFSiggraph2023.pdf 26ページからの引用:

OpenExec は以下である

  • 汎用演算エンジンであり、キャッシュ・無効化のメカニズムを持つ
  • カスタムデータ型とカスタム計算コールバックをサポートし、任意のロジックを実装できる
  • 「記述済の値」に加え「導出された値」をシーンへと返す

OpenExec は以下ではない

  • 名前空間をプロシージャルに生成・削除するものではない
  • リグシステムではない(ただし基盤としこの上にシステムを構築することは可能)

リアルタイム評価, スケーラビリティ, USD統合 の観点からその特徴を挙げる

3-1 リアルタイム評価

OpenExecは、計算グラフを用いて、入力の変化に応じて評価を実行し、結果をリアルタイムに反映させる即応性を持つ。Prestoでは、このリアルタイム評価の仕組みを利用し、たとえば「あの夏のルカ」でのルカパグーロの海獣への変身のような複雑なシーンや、インタラクティブな操作を伴う作業をスムーズに行うことが可能であったという。OpenExecを搭載することで、プレビューやイテレーションの時間を大幅に短縮し、より直感的で効率的なワークフロー構築の基盤技術が整うと期待される。

3-2. スケーラビリティ

OpenExecは、大規模なシーンや複雑な計算を効率的に処理できるスケーラビリティを備えています。Prestoの群衆ワークフローの例からもわかるように、OpenExecは多数のオブジェクトが存在するシーンでも高いパフォーマンスを発揮します。これは、OpenExecが依存関係を追跡し、変更のあった部分のみを再計算するキャッシュと無効化のメカニズムを備えているためと考えられます。CG技術者は、OpenExecを利用することで、これまで時間のかかっていた大規模シーンの取り扱いや、複雑なシミュレーションなどをより現実的な時間で実行できるようになる可能性があります。

3-3. USDとの統合による可能性

OpenExecは独立したプロジェクトはなく、USDの機能の一部として提供される。つまり、USDシーン内で動的な値を扱えるようになる。例えば、あるPrimの属性が、シーン内の他の属性の値に基づいて動的に駆動されるような設定が可能になる。また、OpenExecはカスタムデータ型とカスタム計算コールバックをサポートするため、USDの枠組みの中で、独自の計算処理を柔軟に組み込むことができるようになります。さらに、USDは業界標準となることを目指しており、OpenExecがUSDに統合されることで、その汎用性と相互運用性が向上し、様々なDCCツールやパイプラインでの活用が期待されます。 過去のSIGGRAPHでは、Prestoの実行システムのアーキテクチャに関する詳細が共有されており、その基盤技術がOpenExecに引き継がれると考えられます。Prestoの実行システムは、コンパイル、スケジューリング、評価の3つのフェーズに分かれており、効率的な並列処理を念頭に設計されています。このような実績のある実行エンジンがUSDに統合されることで、よりパワフルで柔軟なシーン記述と実行の可能性を得ることができ、今後のCG制作パイプラインにおいて重要な役割を果たすと期待されます。

4. 構成と実装の確認

では次節より実際のコードを読み込みどのような構成となっているかを見ていく。 なお本章のコードの読解にあたっては Gemini 2.5, 執筆にあたっては Claude 3.7 Sonnet、および OpenAI o3 を大いに利用した。 まずはOpenExec のコード配置を見ていく。OpenExecは pxr/execディレクトリに実装されており、以下のモジュールに分かれている:

  • pxr/exec/exec: 中核となるシステムAPI
    • リクエスト管理・依存グラフ構築中核API(system.h,request.h,compiler.hなど)
  • pxr/exec/vdf: 低レベル実行エンジン(Value Definition Framework)
    • 低レベルの依存グラフ表現・スケジューリング・並列実行エンジン(network.h,schedule.h,parallelExecutorEngine.hなど)
  • pxr/exec/ef: ページベースのキャッシュとエグゼキューション(Execution Framework)
    • 上位実行基盤:Executor本体・依存キャッシュ・LeafNode管理(executor.h,dependencyCache.h,leafNode.hなど)
  • pxr/exec/esf: シーン抽象化インターフェース(Execution Scene Framework)
    • シーン抽象化:ステージ・オブジェクト・属性表現(stage.h,object.h,attribute.hなど)
  • pxr/exec/execUsd: USDとOpenExec間のブリッジ実装
    • USDシーンとのブリッジ:USDオブジェクトをesfインターフェースに適合(sceneAdapter.h,stage.h,prim.hなど)

主要なエントリーポイントとなるコードは以下:

pxr/exec/exec/system.h          # メインシステムAPI
pxr/exec/exec/request.h         # 計算リクエストの作成と管理
pxr/exec/execUsd/sceneAdapter.h # USDアダプター

高レベルアーキテクチャ

OpenExecのアーキテクチャは、以下のレイヤー構造である:

+-------------------------+
|      Application        |
+-------------------------+

+-------------------------+
|    OpenExec (exec)      |
+-------------------------+
       ↙         ↘
+----------+   +----------+
|    ef    |   |   esf    |
+----------+   +----------+
     ↓              ↓
+----------+   +----------+
|    vdf   |   | execUsd  |
+----------+   +----------+

              +----------+
              |   USD    |
              +----------+
  1. シーンデータ層 (USD → esf → execUsd):

    • OpenExec はesf抽象インターフェースを通じ USDシーンへとアクセスする
    • execUsdはUSDオブジェクトをラップしこれらの抽象インターフェースに適応させる
      • シーンデータに介入し計算や依存関係を管理することができるようになる
    • シーンデータの変更がESF層を通じてEXEC層に伝播される
      • これを用いることで変更を検出し、再計算やキャッシュの無効化を行うことができる
      • esf / execUsd 層でこれらを管理することで、依存グラフの構築や計算リクエストへと伝搬する
  2. コンパイル層 (exec):

    • 計算リクエストを処理する
    • 計算をノードのネットワークにコンパイルする
    • 計算依存グラフを表すVdfNetworkを作成する
    • 計算グラフのトポロジーを管理する
  3. 実行層 (vdf → ef):

    • vdfは低レベル実行エンジンを提供する。
    • efはvdfの上に高レベルの実行サービスを構築する
    • スケジューリング、実行、キャッシング、無効化を処理する

レイヤー間の連携とデータフロー

OpenExecの主要レイヤー間で次のようにデータが連携する

  1. exec: クライアントの計算リクエストを受け取り、VdfNetwork依存グラフを構築する
  2. vdf: グラフ表現とスケジューリング情報(VdfSchedule)を管理し、並列実行エンジンへ渡す
  3. ef: EfExecutorLeafNodeCacheで実行を管理し、キャッシュ・部分実行を実現する
  4. esf/execUsd: USDシーンの抽象化とブリッジを介して入力データを提供する

むすび

OpenExecは、USDエコシステムにおける計算処理の標準化と効率化に向けた重要な一歩である。現段階では実験的な機能であり、制限はあるものの、その設計と基盤は将来的に非常に強力な計算フレームワークとなる可能性を秘めている。

シーンデータに基づく計算処理のための統一されたアプローチを提供することで、OpenExecはUSDの応用範囲をさらに拡大し、より複雑で高度なワークフローを可能にすることが期待される。開発が進むにつれて、機能の充実、パフォーマンスの最適化、そして使いやすさの向上が図られることで、幅広いユーザーにとって価値のあるツールとなるだろう。

補遺

OpenExec とは直接関係ないが、以下の他ソフトウェアの情報も参考になるかもしれない。