【レポート】パイプライン開発者が知っておきたいUSDの使い方#CEDEC2021 #classmethod_game
みなさんこんにちは、杉金です。
今回は、2021年8月24日〜26日の間で開催のCEDEC2021のセッション「パイプライン開発者が知っておきたいUSDの使い方」につきまして、視聴レポートをお伝えします。
セッション情報
スピーカー
DNEG London
Pipeline TD
加藤 僚一 氏
セッション概要
Pixar USD(Universal Scene Description)は様々なツールで採用されはじめ、身近なツールになりました。単なるファイルフォーマットではなくAPIやその思想を理解することで、効率的なパイプラインを構築できます。しかし、現状はドキュメントやサンプルも少なく、作業は手探りになりがちです。本セッションでは、USDをPythonから扱う上で最低限知っておきたいことや、USDが持つ機能の一部を、実際のコードを使いできる限りわかりやすくお伝えします。
レポート
今日話すこと
PythonからUSDをざっくりと使う方法を説明する。USDは最近話題に上るようになってきたが実際に使っているスタジオでも試行錯誤が必要だったりと使い方に関してはまだまだ情報不足。USDを単なるファイルフォーマットと思っていたり、何となく知っているが使い方がよく分からない人もいる。USDを使ったパイプラインに興味のある方、USDを具体的にもっと知りたい方向けに実際のPythonコードを使ってUSDの雰囲気を掴んでいく
もくじ
ソースコードなどの資料についてはこちら https://github.com/kat0c0tak/cedec2021
環境構築
USDは多くの機能を持っているため一言で表すのは難しい。ここではUSDを代表する2つの機能を紹介
USDはソースコードで配布されており使用するためにビルドが必要となる。NVIDIA社よりプレビルドが提供されているためそちらを使うのが一番簡単。このチュートリアルではRendermanを使うためにソースコードからビルドを行う
Python2.7.14を使用
用語や概念
Pythonからの基本操作
Pythonコードを実行するとUSDファイルが作成される
Pythonコードを解説していく。まずはステージについて
プリムはUSDにおける重要要素でUSD自体が様々なタイプのプリムで構成されてる。プリムは基本的にスキーマを介して使用する
スキーマとはプリムに目的を定義するもの。スキーマオブジェクトを使って目的に合わせた処理を行うことができる。スキーマ大きく分けて2つある
アトリビュートはプリムのデータで、スキーマオブジェクトを使って作成する。使用可能な関数は使っているスキーマによって異なる
最後にステージをSave関数で保存する
Tipsその1
Tipsその2
コンポジション
プリムとメタデータの入れ物。1つのUSDファイル=1レイヤー
プリムやレイヤーを合成するUSDのメイン機能
サブレイヤーはレイヤー同士を合成するコンポジションアーク
リファレンスはプリム同士を合成するコンポジションアーク。PythonコードではGetReference()でリファレンスの元を取得して、その後にAddReference()でリファレンス先を指定する
遅延ロードできるリファレンスで、明示的に指定しない限り読み込まない。読み込みに時間のかかる大きいアセットに設定すると効率的
プリムの中身をスイッチするコンポジションアークで、中身はプリムでもアトリビュートでもよい
継承はリファレンスに似ているが継承元をいつでもオーバーライドできることが大きな違いで、計算コストがかかるので大量のオーバーライドが発生すると効率が低下するため要注意
データの扱い方
ジオメトリ
USDでのジオメトリもプリムを使って扱う
UsdGeomMeshプリムは主にDCCツールから出力して使用する
トランスフォームはUsdGeomXformというスキーマを使う
先ほどのジオメトリとコンポジションアークを組み合わせてシーンを作成する
まず床の作成
続いてキューブの作成
加えてキャラクターの作成
そしてジオメトリを組み合わせる
usdviewで確認。右側に見えているのが選択中のプリムがどのようにコンポジションされたかが確認できるもので、キャラクターはリファレンスでコンポジションされていることが分かる
シェーダ
シェーダ情報とアサイン情報をツール間で共有することを目的としている
レンダラー対応についてはプラグインで追加可能
USDでのシェーダネットワークは3つのプリムで構成する。(Material/Shader/NodeGraph)
単色マテリアルの場合(赤いスフィアを作成)
作成するUSD
まずMaterialプリムについて
今回の例では、Materialのoutputs:surfaceとShaderのoutputs:surfaceを接続している。接続するためにconnectを使用する
Materialプリムはスフィアオブジェクトにアサインされている。Materialプリムのアサインはリレーションシップを使用する
リレーションシップとはプリムやレイヤー間等のリレーションを定義するもので、今回はマテリアルとオブジェクトのアサインに使用している
Shaderプリムについて
Shaderプリムは1つのShaderに対して1つのShaderプリムが使われる。基本的に入れ子にすることはできない
Shaderプリムのアトリビュートについて
UsdPreviewSurfaceについて
シェーダがオブジェクトに接続されるまでの流れ
インプット同士を接続することもできる
Pythonコードの流れを観ていく。まずはじめにMaterialプリムを作成する
次にShaderプリムの作成
シェーダの名前、インプット名、型はUSD上から調べられる
USDの型名はsdfのパッケージを使用して指定できる
ShaderプリムとMaterialプリムの接続
最後にマテリアルのアサインを行う。MaterialBindingAPIを使用する
BindingAPIについて
テクスチャを張る場合
この例のポイントについて
シェーダネットワークを見ていく
シェーダを作りマテリアルのoutputsに出力する
PrimvarReaderとUVTextureについて
今回作成するシェーダネットワークのPythonコードで、シェーダが3つに増えてそれぞれ接続している
ディスプレイスメントシェーダの場合
この例のポイント
はじめにPrimvarReaderでUVデータを読み込み、それぞれのUVTextureシェーダに渡す。Textureシェーダはそれぞれのチャネルを読み込みpreviewSurfaceに渡す。previewSurfaceはMaterialPrimのdisplacementとsurfaceのoutputにデータを渡し、そのMaterialPrimがMeshPrimにBindされる
これが今回のUSDファイル
こちらがPythonコード
Render targetについて説明。シェーダをレンダラー毎に切り替える機能
USDでのライトについて。下位互換がなくなる点は要注意
USDのライトには共通して使えるアトリビュートとAPIがある
USDではHDプラグインを使用してレンダリングができるが、いくつかのライトが対応していないため注意が必要
ライト
ここではいくつかのライトをRendermanとStormのレンダリング結果を使って紹介する。まずはSphereLightについて
DomeLightについて
DistantLightについて
ShadowAPIについて(APIスキーマ)
ShapingAPIについて
CollectionAPIについて
今回の例では赤色のライト青色のライト、2つのキューブを用意して片方のキューブには青色のライトの影響を受けないようにしている。もう片方のキューブには両方のライトの影響を受けるため紫色に見えている。リレーションを使ってリンキングしている
アニメーション
USDでのアニメーションを実現するには2つの方法がある
アトリビュートのタイムサンプルを使ってアニメーションを作成する
Pythonコードを表示(左側)
カメラ
USDでカメラを使う場合はUsdGeomCameraプリムを使う
カメラを作成する。カメラ以外のアセットはサブレイヤーを使って読み込んでいる
結果を確認する際にUsdviewでカメラを操作するが、その時のポイントについて説明。デフォルトでは作られたカメラはレンダリングには使われない。そのためレンダリングするカメラと撮影範囲を指定する
ショットビルド
最後にサンプルショットを作成する。ターンテーブルを想定
はじめに各工程をレイヤーに分ける
ショットの構成について。プリムでScopeやoverが設定されていたり、型が設定されていないプリムについて次で説明
OverとTypelessとScopeについて
EditTargetについて説明。今回、各工程をレイヤーに分けて編集するためEditTargetを編集する必要がある
まずルートレイヤーの作成
次にレイアウトレイヤーの作成
続いてアニメーションレイヤーの作成
ライティングレイヤーの作成
レンダリング
作成したショットをレンダリングしていく。レンダリングの方法について
レンダリング結果(実際は動いてます)
便利な機能の紹介
USDの所感についてみんなでUSD使おう!!
所感
非常に内容が充実していると感じたセッションでした。見ようと思ったきっかけがzennでBlender3.0のUSDインポートについての記事を見かけて、Blenderは知ってるもののUSDって何だ?っていうところからこちらのセッションに参加させていただきました。パイプラインと聞いてCI/CDパイプラインしか思いつかない私にとって完全に未知の世界でしたが、大人数で効率よく開発するための技術としてよく考えられたものであることが分かりました。実際のセッションではスライド1枚ずつ丁寧に解説されてますので、気になった方はセッション動画をぜひともご覧ください!