USD (ユニバーサルシーンディスクリプション）

SIGGRAPH ２０１６ にて、ピクサーの新しいオープンソースプロジェクト USD (Universal Scene Description）が github にて公開になりました。

https://github.com/PixarAnimationStudios/USD

CG映像制作で、特にパイプライン構築に関わっている方々には非常に面白いライブラリだと思いますので、この場を借りて日本語で解説させて頂こうと思います。ここで書く内容はすべて現時点での公式のドキュメントおよびソースコードから得られる情報に基づいていますので、最新の情報は常に公式ドキュメントを参照していただければと思います。

# USD って何？

USD はひとことで言うとピクサーが最新の映画（ファンディング・ドリーなど）の制作に使っているシーングラフのライブラリです。USD プロジェクトはこのライブラリをオープンソースにすることで様々なDCCツール等でもデータをやりとりできるようにしよう試みです。Alembic や FBX と似ているところもありますが（実際 Alembic からのデータ変換も標準でサポートされています）、最大の特徴は強力な非破壊のコンポジション機能を持っていること、かつ実際の映画制作で用いられているコードそのものでもあるため、巨大なアセットに対応したスケーラビリティも備えているところにあります。USD のコンポジションの詳細はまた別のエントリで詳しく触れていきます。

# Hydra って？
また、今回のオープンソースには OpenGL のレンダリングエンジン、Hydra も含まれています。Hydra は GL4.5 に対応した高速かつスケーラブルなリアルタイム用のレンダリングエンジンで、USD の巨大アセットを効率的にプレビューすることができます。実際は Hydra そのものはシーングラフとは無関係で、USD には直接依存していませんが、usdImaging というコンポーネントが USD と Hydra の橋渡しをするようになっています。つまり、Hydra を使って独自のアプリケーションのシーングラフを描画することもできますし、それに USD を組み合わせることもできます。将来的には Hydra は OpenGL 以外のレンダリングAPIに対応する計画もありますが、現在の OpenGL のバージョンでは以下のような新しいフィーチャーを使って大規模データを高速に描画できるように工夫されています。

- Multi Draw Indirect (OpenGL 4.5)
- Direct State Access (OpenGL 4.3)
- Shader Storage Buffer (OpenGL 4.3)
- Bindless Texture (ARB)
- Bindless Uniform Buffer (NV_shader_buffer_load)

また階層に制限のない再帰インスタンス描画、インスタンス個別GPUフラスタムカリングなどもサポートします。OpenSubdiv 3.0 も組み込まれ、すべてのジオメトリをサブディビジョンサーフェスで適応分割テセレーションし描画することもできます。
Hydra は usdview, maya usd plugin, katana usd plugin など usd を表示したいアプリケーションでライブラリとして使用することができます。Hydra については後日別エントリで詳しく解説していきたいと思いますが、こちらのビデオもぜひ御覧ください。

GTC 2015: Pixar's Real-Time Render Engine for Feature Film Assets
http://on-demand.gputechconf.com/gtc/2015/video/S5327.html
GTC 2016: Real-Time Graphics for Feature Film Production
http://on-demand.gputechconf.com/gtc/2016/video/S6454.html


# 動作環境は？

現状は linux 版のみ動作確認されているアルファ版ということで、今後フィードバックを元にAPIを確定し、OSX や windows への対応も勧めて正式版リリースに向かうことになりますが、すでにソースも公開されているので、linux 環境さえあればすでに様々なテストをすることができます。また一部不完全ですが、 OSX でのビルドと実行は可能です。

# 歴史

初代トイ・ストーリーではすべてのショットが専用のプログラムで記述されていましたが、バグズ・ライフ以降、ピクサーではマリオネット（社内ではmenvと呼ばれていました）という社内ツールで、リファレンスやレイヤーなどのデータを再利用するための仕組みを構築してきました。このツールは2004年に開発がスタートした Presto という新しいシステム（メリダとおそろしの森で初めて採用）で全面的にリニューアルされて、アニメーションやレイアウトなどの部門で活用されました。

Presto ではリファレンスとレイヤーを用いることで、ある部門が作ったデータ（たとえばリグ）の内容を書き換えずに、別の部門（アニメーション）がデータを追加して、それを受けとった後工程（ライティング）はそれの構造を意識せずに合成された結果を参照することができます。これが非破壊シーングラフの根本になりますが、具体的にはフォトショップのレイヤーのイメージを思い浮かべてみるのもいいかもしれません。レイヤーを分けて編集しておくことで、あとから元のレイヤーの色味を調整したり、絵を差し替えたり、といったことが、後工程を繰り返すことなくできるようになります。また様々なバリエーションを作るときにデータを無駄に複製する必要もあります。

これは素晴らしかったのですが、初期の Presto のランタイムコンポジションはそれほど速くなく、アニメーション以降の作業では全フレームをベイクして出力したジオメトリキャッシュのような状態で使う必要がありました（TidScene と呼ばれるバークレーDBをバックエンドにした軽量シーングラフ。これは Alembic と同等です）。ここでもリファレンスなどの機能は取り込まれ、GL の高速なプレビューもできていたのですが、Presto の極めて柔軟なコンポジションは利用できませんでした。

そこで 2012 年から新たに開発が始まったのが USD であり、これは TidScene の持つ軽量なシーングラフの上に、Presto の機能であるフレキシブルで多彩なコンポジション機能を組み合わせ、かつハイパフォーマンス・スケーラブルに動作するよう再設計された、ピクサーで４世代目のシーングラフライブラリになります。

USD はファインディング・ドリーの制作で本格採用され、それ以降の映画全てで全シーン・全部門のデータ交換に使われる、現在のピクサーの映画制作の根幹とも言えるデータ構造となっています。

# スキーマ
USD 自体はコンポジション機能と階層を持つデータ構造であり、ジオメトリやシェーディングなどはその上にスキーマとして定義されています。UsdGeom が３Dグラフィックスで一般的に用いられるジオメトリ用のスキーマ、UsdShadeがシェーディング用のスキーマ、などで、これらに加えてユーザが独自のスキーマを追加して定義することも可能です。

# ファイルフォーマット

usd はアスキーとバイナリの２つのフォーマットがあります。アスキーは

``` cube.usda
#usda 1.0
def Cube "cube" {
}
```

このような形をしています。この記述についても、詳しくは別のエントリで触れていきたいと思います。

# python バインディング
USD のほとんどの機能は python バインディングが用意されているため、python から usd ステージの読み書き・操作が一通り可能です。USD の基本的な概念になれるためには、python からアクセスするとわかりやすいでしょう。これも後日別エントリを書きたいと思います。

# おわりに
今回は簡単な紹介だけでしたが、引き続き（おそらく不定期に） USD および Hydra、また OpenSubdiv などの使い方や技術的な詳細、APIなどについて解説を追加していければと思います。