
SolarisとUSDを用いたワークフロー導入について (Part2)
4.SOLARISの話
4.1 全般
第二回はHoudini18で追加されたSolarisについて考えていこうと思います。
そもそもシーングラフとは何か?
例えば、SOP側で以下のようにAlembicファイルを読みこんだシーングラフを作成したとします。
これをSolaris側に読み込み、シーングラフを確認すると階層の記述内容が異なったことが確認できます。


これは Houdini全体がHydra Scene Delegateに対応したわけではなくて、
Houdini独自のシーングラフであるSOPをUSDシーングラフにコンバートして Solaris空間でUSDのシーングラフとして扱っているからが理由になります。
つまりSolarisはUSDそのものを作成する空間だという事がここで認識できます。またキャラクターをスケルトンを維持したままSolarisに持っていく場合は別途必要な工程等もありますので、それらは以下の記事が参考になります。
▼Solarisについて
▼キャラクターをSolarisに読み込む方法
※ページ内のSOP Character Import LOPの説明をご参照ください。
▼Houdini Solaris(USD) トレーニング Part1
(USDの概念について)
▼Houdini18.5 Solaris(USD) トレーニング Part2
(Hydraとビューポートレンダリング)
▼Houdini18.5 Solaris(USD) トレーニング Part3
(SolarisとLOPネットワークの使い方)
▼Houdini18.5 Solaris(USD) トレーニング Part4
(Solaris空間でのUSD操作)
▼Houdini18.5 Solaris(USD) トレーニング Part5
(USDシーンのレンダリングについて)
4.2 USD書き出し時の注意点
StaticなUSDデータではなく、アニメーションデータを含んだUSDとして出力する場合は、RAMの使用量に注意する必要があります。出力中にすべてのRAMを使い切った場合はFatal Errorとなり、Houdiniが強制終了します。
この問題を回避するためには、以下の2点に注意する必要があります。
SOPレベルにおけるキャッシュの取り方
USD Render node側の設定
4.2.1 SOPレベルにおけるキャッシュの取り方
SOPレベルでは、Cache geometryノードとFile Cache geometryノードを使用したキャッシュの取り方があります。キャッシュは、アニメーション結果のプレイバックを高速に行うことを目的として使用するものです。
基本的にはHoudiniでのプレイバック高速化は、メモリへ計算したデータを保存して再計算を省くか、ディスクへファイルを出力し、そのファイルを読み込むことで再計算を省くかの2通りがあります。

それぞれ異なった特徴があり、目的に応じて使用する必要があります。
特にSOPレベルから直接Stageレベルにアニメーションを読み込む場合は、SOP側でアニメーションの計算が行われたのちに結果が読み込まれる事になるので、その分の余剰メモリ使用量を考慮しながら作業する必要が出てきます。
4.2.2 USD Render node側の設定
アニメーションをUSDファイルとして出力する場合、メモリの使用量に応じて”Flush Data After Each Frame”へオプションを切り替える検討もお勧めします。2つのオプションの違いは以下の通りです。
▼Flush Data After Each Frameがオフの場合(デフォルト)
ディスクに保存可能なUSDレイヤーを生成するが、書き出されるまではデータは一時的にRAM上に保持される。
LOPネットワークが大量のデータを生成する場合、RAM使用量が急増する可能性がある(ただし、フレーム間で同じデータは重複しないようになっている)。
オフの場合、多くのメモリを消費するため大規模なデータを扱うとメモリ不足になる可能性があります。
▼Flush Data After Each Frameがオンの場合
各フレームデータをUSD保存し、一時的にRAM上には1フレーム分のデータしか保持しないようになります。
その結果、書き込み時間が長くなる可能性がある。
尺分すべてを書き出す事になるので最終的にトータルの容量が大きくなる可能性がある。
しかし、書き出し時に使用するRAM容量は大幅に抑えられるため、大量のデータでも書き出し可能になる。
読み込む際はHoudiniの「USD Stitch(フレーム毎にUSD連番を読み込むノード)」機能を使い、メモリ上で前のフレームと新しいフレームのデータを統合する事になります。
Houdiniでアニメーション付きUSDを書き出す際にメモリ不足になる場合、「Flush Data After Each Frame」をオンにすることでRAM消費を抑えることができます。
つまり...
「Flush Data After Each Frame」は、RAM上で全フレーム分を保持してから書き出すか、各フレーム毎に書き出すかを切り替えるオプションということです。
4.2.3 ここまでの検証
検証として
SOPレベルで大量にアニメーションするキャラクターを配置し、USD書出しを行ってみます。その時、SOPレベル内にCache geometry ノード、Flush Data After Each Frame の有無で何が起きるかを検証していきます。
▼検証用データの内容
ここでは、SOP側で作成されたアニメーションをSolarisに読み込むサンプルをもとに説明しています。

▼HoudiniのUSD書き出し時のCache geometryノードの有無
OpenUSD単体(Flush Data After Each Frameがオフ)の書き出しの場合
Cacheノードあり→失敗
Cacheノードなし→失敗
OpenUSD連番(Flush Data After Each Frameがオン)の書き出しの場合
Cacheノードあり→失敗 (SOP側のアニメーションがRAMに保持されたままになってしまうため)
Cacheノードなし→成功 (SOP側のアニメーションがRAMに保持されなかった為)
▼Flush Data After Each FrameのRAMの使い方
USD単体(Flush Data After Each Frameがオフ)の書き出しの場合
→失敗USD連番(Flush Data After Each Frameがオン)の書き出しの場合
→成功
File Cacheのほうは、USD書き出し時にメモリが溜まっていく現象は起きませんでした。


▼Point InstanceではCacheが使用されていても問題ないのか?

USD単体(Flush Data After Each Frameがオフ)の書き出しの場合
Cacheノードあり→成功
Cacheノードなし→成功
Point Instanceの場合は、実モデルが無い分メモリ使用が抑えられるのでCacheノードがあっても書き出しは成功しました。しかし、少ないながらメモリが溜まっていっているので、シーンによっては失敗する可能性があると予想されます。


4.2.4 結果とまとめ
シーン内にアニメーションを含み、USDデータとして出力を行った際にメモリ不足となってしまう場合は以下の設定を行うことをお勧めします。
SOPレベルでプレビュー用にキャッシュを保存したい場合は、File Cache geometry nodeでディスクにファイルを書き出してからインポートする
USD Render node (LOPノード)で、Flush Data After Each Frameを有効にする
USDはそもそもリファレンスなどを使用して1ファイルの運用を目指していたものです。ですがPCスペックや制作環境に応じて書き出し方や運用方法は異なると私は考えています。
次回はこの辺りも踏まえてさらに踏み込んで、動的なUSDの扱いを深堀していこうと思います。