すあまの備忘録

誰得内容の自分のための非営利目的備忘録ブログ(筆者がわかっても内緒にしてください)

KarmaをバッチレンダリングするためのUSD運用メモ

※3/27 SOP Import / Scene Import使用時、アニメーションしている場合の読み込み注意を追記

最初に大まかなレンダー手順の説明をしてその後レンダーするシーンを用意する注意をメモ。

当然バッチレンダー(ネットワーク上のPCへの分散)することが前提なのでローカルのみでレンダーする場合は無視して良い箇所も多い。

USD周りは勉強中なため間違ってたら教えてください。後やはりUSDはパイプライン&分業ありきって感じ。

レンダーシーンの用意

USDの書き出し

これはMantraで言うところのifdの代わりとなるUSDをを書き出す処理。

カメラ、ライト、ジオメトリとレンダー設定をし、USD ROPでUSDを書き出す。(※下記画像は例なので良くない組み方)

f:id:godofsuama:20220321132712p:plain

最低限設定が必要なのは書き出すフレームレンジと書き出し先

f:id:godofsuama:20220321132903p:plain

注意

このUSD ROPは以下の箇所を設定すると連番のUSDとして書き出すことができる。

f:id:godofsuama:20220321133109p:plain

しかし、この状態で書き出してしまうとフレーム間での連続性がなくなってしまうようで警告が出る。

レンダーシーンのUSDはワンファイルで書き出すのが理想なのでこの方法は使用しないほうが良い。

バッチレンダー

書き出したレンダーシーンのUSDをバッチコマンドで指定してレンダーさせる。レンダラーが複数あったりした場合はレンダラーも指定したほうが良い。

バッチコマンド

https://www.sidefx.com/ja/docs/houdini/ref/utils/husk.html#karma

例:

/opt/hfs19.0.531/bin/husk 'レンダーシーンUSDのパス' -f '開始フレーム' -n 'レンダーするフレーム数'

先に書き出し先フォルダが存在している必要があるので、実際はフォルダチェック処理とかも必要。

レンダーするものの書き出し

先に描いて置くと、SOP Import / Scene Importでのジオメトリ、Volumeの読み込みはあまりおすすめできない。細かいことは後述。

Geometryの書き出し(ワンファイル)

USD Exportを使用してGeometryをUSDに書き出す。Alembicでも可だが、AlembicよりUSDのほうがファイルサイズが小さい。

f:id:godofsuama:20220321143232p:plain

f:id:godofsuama:20220321143256p:plain

ConfigureでUSD用への変換ができるがあまり詳しくないので省略。

Geometryの書き出し(シーケンス)

ファイル名を書き換え、Separate File Per Frameにチェックを入れて書き出す。

f:id:godofsuama:20220321145557p:plain

これだけではシーケンスUSDは扱うことができず、Stitch処理というものが必要。

Stitch処理(USD Stitch Clip)

ROP階層のUSD Stitch Clipノードを以下設定で実行することでStitchできる。

f:id:godofsuama:20220321150129p:plain

f:id:godofsuama:20220321150156p:plain

Clip Primitive Pathは、pathアトリビュートがあればそのpathの最初の階層の名前になる。

例:/bg/mountain/far の場合は、/bg

なければシーケンスを書き出したUSD ExportのRelative Path Prefixになるはずなので間違えないように書き換える必要がある。

f:id:godofsuama:20220321150335p:plain

うまく書き出せると以下のようなファイルが生成される。

f:id:godofsuama:20220321150457p:plain

Stitch処理は面倒だが、他の部署(ライティング等)に渡す際に1つのファイルでのやり取りになるので取り回しやトラブルの回避ができるようだ。

Stitch処理(USD Stitch)

紹介はするが想定する用途としては意味がない処理なので注意

USD Stitchという似た名前のノードがあり、こちらは全フレームをワンファイルにマージし直すノードになる。

そのため巨大な1つのUSDファイルに戻るだけなので間違えないように。

f:id:godofsuama:20220321151013p:plain

Volumeの書き出し

同様にUSD Exportを使用してUSDをに書き出す。この際にVDB Volumeに変換する必要がある。

f:id:godofsuama:20220321143813p:plain

Volumeを書き出すと1つのUSDファイルとフォルダの中にVDBがはいったものが書き出される。

f:id:godofsuama:20220321144000p:plain

この中にはフォルダの中のVDBへのパスはもちろん、TimeSampleやFieldの情報などが入っていて、これを読み込むことでVolumeをUSDとして扱うことができる。

VDBを直接読むこともできるが、こちらのほうがUSD的には推奨ということらしい。

※この不思議なフォルダとファイル名を変更したい場合 SOPで書き出し前にString型のusdvolumesavepathというdetailアトリビュート

$HIP/geo/volume/volume.$F4.vdb

などを指定すればそのファイル名で書き出される。

Volumeも同様にフレームごとで書き出すことによってメモリ負荷を下げることができる。

しかし、特殊なフォルダが大量にできてしまうため、フレームごとに書き出す場合はこのusdvolumesavepathは必須となる。Stitch処理が必要なのも同様の手順で行える。

レンダーするものの読み込み

Reference

基本的にReference(Payload)で読み込む。

f:id:godofsuama:20220321152527p:plain

Sublayer(File)も用途によってはありだが、基本Sublayerは強い処理での上書きを行うのでただ読み込むだけなら避けたほうが良いかなと思う。

SOP Import / Scene Importの扱い

SOPやObjから直接読み込めるこれらのノードは便利だが扱いに注意する必要があり、そのままではUSD ROPが警告を出してレンダーシーンのUSDを書き出せない。

f:id:godofsuama:20220321134030p:plain

これはレンダーシーンのUSDが原則USD, Alembic, VDBのみをレンダリングする仕様のために起きるエラーで、SOPやObjから読み込んだものはHoudini固有のデータなのでそのままではレンダーシーン用のUSDとして書き出せないために起きる。

  • ローカルのみでレンダーする場合は自動的に変換してレンダーされているので特に問題はない。
  • Light,Camera,Materialはそのまま変換できるので、Scene Import等で読み込んでもエラーは起きない。ジオメトリ(Volume)の読み込みには使用しないほうが無難。

SOP Importを使用したい場合の一応の回避

上記エラーを回避する方法は一応用意されていて、SOP ImportのLayer Save Pathに書き出し先USDパスをいれるとレンダーシーンUSDの書き出し前にこのUSD 書き出し処理が走りレンダーシーンが書き出せるようになる。

f:id:godofsuama:20220321141038p:plain

f:id:godofsuama:20220321140139p:plain

しかし、これもできれば使用しない方が良い。

Layer Save Pathは連番USDファイルでの書き出しはできないため、巨大なUSDファイルができることになる。 さらに、レンダーシーン書き出し前の処理に凄まじい時間がかかることになってしまう。

Scene Importにはこのオプションが見当たらないのでLight,Camera,Material以外の読み込みで使用しないほうが良さそう。

読み込めるがそもそもノードとして(Geometry)が登録されていないのもこのあたりが原因かもしれない。

f:id:godofsuama:20220321135833p:plain

アニメーションしている場合の読み込み注意

カメラなど、ローカルでの確認中にモーションブラーがかからない問題に関して。

※一度ちゃんとUSD ROPでUSDファイルを書き出している場合は基本的に問題は起きないはず。

該当ノード下にCacheノードをつなぎ、

f:id:godofsuama:20220327002254p:plain

Cache BehaviorをAlways Cache All Framesにすることで回避できる。

f:id:godofsuama:20220327002346p:plain