Gafferで.usdファイルを読み込む
前回出力した.usdファイルはSceneReaderノードで読むことができます。Gaffer自体はAlembicファイルを読むこともできるのですが、gaffer-0.48.0.0の時点では.usdファイルからリファレンスされているAlembicファイルは正常に読み込むことができないようです。
Gafferはシーンを一度に読み込んで表示するのではなく、最初はバウンディングボックス表示になっていて必要になった時にジオメトリの表示を行うことができます。上図では、左下のViewがそのモードになっています。これにより重たいシーンも軽快に扱うことができるようになっています。
ルックデブ
一通り準備ができたので、 ルックデブを行なっていきます。
シーンの構築方法は前述のIntroduction to Gafferで解説されているのとほぼ同じです。ただ、今回はArnoldを使用しているため、ArnoldAttributesノードとInteractiveArnoldRenderノードを使用しています。
※ InteractiveArnoldRenderを使用してCatalogueでプレビューする際、いくつか注意が必要なようです。最初にInteractiveArnoldRenderをオンにしただけではレンダリングが開始されません。この場合、カメラのビューポートからカメラを動かすか、CropWindowToolを使ってビューポートを更新するとリアルタイムレンダリングが始まります。また、Gafferはひとつのプロセスで複数のシーンを開くこともできるのですが、複数のInteractiveArnoldRenderがオンになっている場合でも、あまり期待した結果にならないようです。そのような場合、使用したいInteractiveArnoldRender以外は更新を停止しておきます。このあたりの挙動は、正直私もまだ完全に把握しきれていないところなので、これがバグなのか使い方が悪いのか現時点ではわからないです。
アセットファイルをSceneReaderで読み込み、ShaderAssignmentノードとPathFilterノードを使ってシェーダをアサインしていきます。
PathFilterノードは名前ベースでオブジェクトをフィルタリングするためのものです。名前ベースで管理を行なっているため、一度ルックデヴ用のテンプレートシーンを用意しておけば簡単に使い回すこともできます。
下図がシェーダをアサインしている途中の状態です。
左上がArnoldでリアルタイムにプレビューしながら確認している画面です。左下がルックデヴ用のテンプレート、右下がFamilyCar_lookdevノードの中にまとめたルックデヴファイルです。
※ 前回つくったシーンに問題があったためPathFilterノードで指定するパスを"/.../"で始まる形にしないとうまく動かない状態になってしまいました。ここがきちんとできていれば、もっと楽に管理できるのですが。無念......
FamilyCar_lookdevはBoxノードです。Boxはノードの塊をパッケージ化するためのものです。今回はFamilyCar_lookdevノードをExportしてショットシーンでリファレンスします。
ショットシーンの構築
レイアウトが終わった.usdファイルとルックデヴファイルを使用してショットシーンを構築し、ライティングやレンダリングを行なっていきます。
SceneReaderで.usdファイルを読み込み、一度全てのジオメトリに対してlambertシェーダを割り当てています。その後SubTreeノードを使用してシーンをアセットごとに分解し、先ほどExportしたルックデブファイルをリファレンスしたものを使ってシェーダをアサインします。
そして、最終的にカメラやライト、アセットをGroupでひとまとめにしてショットシーンを構築しています。
事前にlambertシェーダを割り当ててからルックデブファイルで上書きしているのはエラーチェックをしやすくするためです。上図の例では車のフロントグリルや店舗の日よけのフレーム部分にlanbertシェーダの色がそのまま出ているため、エラーがあることがわかります。
このように、上流で指定した情報を下流で一部だけ上書きするといったことができます。これにより、元データに手を加えることなく、エラーチェックやショットごとの細かい調整を行えます。
これだけの内容を行なっているにも関わらず、シーンはとてもシンプルです。また、アセットやレイアウト、ルックデブ情報は全て外部でもっているため、ライティングを行いながら、その前工程の作業を並行して行うことができます。シーンを再構築する、一部の情報を差し替えるといったことを簡単に行える点がGafferの強力なところです。
レンダリング
最後にレンダリングを行います。先ほどの図のノードグラフの右下側、赤い部分がレンダリングとファイルへの格納を行なっている部分になります。
本番レンダリング用にArnoldOptionsノードでArnoldのパラメータ調整を行い、ArnoldRenderノードでレンダリング、ImageWriterノードでファイルへの出力を行います。図ではCatalogueノードからの出力をファイルに書き出しているのですが、正直なところ、このやり方が正しいのかどうか確信がもててはいないです(※)。
※ やはり正しくなかったため、私のBlog「PHILO式:Philosophy of Hiroshi」の下記記事で正しいと思われる方法をご紹介しています。
Gafferでのバッチレンダリング
ですが、これで最終レンダリングまで行うことができました。ここから更にアセットをブラッシュアップしていけばよりクオリティの高い画像に仕上げることができます。そして、その作業を全て複数人で並行して行うことができるのです。
まとめ
第5回までで、駆け足ではあるものの、イチからUSD環境をつくってレンダリングまでできるようになりました。USDをパイプラインの基盤にすることで、MayaだけではなくUSDに対応しているアプリケーションであれば何を使用しても最終的にGaffer(やKATANA)にデータをもっていってライティングしつつ、並列作業を行うことができます。これまでは特定のアプリケーション、特定のバージョンに強く縛られていたパイプラインに強力な柔軟性をもたせることができます。
そして、世界で一般的に使用されている環境を揃えることで、海外プロダクションで行われている最先端のツールとフローを、それほど高度な技術を使わず、もちろん開発なども行わずに試せることがわかっていただけたでしょうか。
今後の課題
これでMaya上でレイアウトしたシーンをUSDを介してGafferにもっていき、Arnoldでレンダリングするという一連のながれをつくることができました。今後実際のプロダクションできちんと回るようなしくみをつくりこんでいくためには、
・より洗練されたルックデヴのやり方
・アセット出力のやり方
・カメラやライト、アニメーションといったショットに付随するデータの扱い方
・レンダーサーバとの連携
などなど、確認することはたくさんあります。これはとても大変な道のりですが、最低限一通りのことができるとわかった以上、後は「やるかやらないか」それだけです。
次回予告
今回でUSD編は一段落です。次回はこれまでの内容を踏まえつつ「新しい技術をパイプラインに導入するときに、どのようなことを考えていくのか?」というテーマでお話していきます。
第6回の公開は、2018年11月を予定しております。
プロフィール