SOLARISのKarmaRenderSettingsを調べよう

6 min read読了の目安(約5600字

Houdini SOLARISでは、アセットのレイアウトやUSDのオーサリング関連は
色々調べてきたのですが、
ライティングやレンダリングをする部分に関しては全然調べていなかったので
今回はレンダリング部分を調べていこうと思います。

...といっても、レンダリングのパラメーターがどうこうというよりも
設定をどう作ればいいのかというパイプライン屋的な話が中心です。

カメラを作る

まずはサンプルシーンについて。
いつものようにキッチンセットをHoudiniのLOPにロードして

Cameraを作成します。

ViewPortの右上のカメラの選択を、作成したカメラに変更して
Tie View To Camera/Lightにチェックを入れます。
このチェックを入れることで、ViewPortの操作で
編集したいカメラを移動したりできるようになります。(わからなくてハマった)

Viewportのレンダラを変更する場合は、Perspとなっている部分から
「Karma(Beta)」を選びます。

これで準備完了です。

実際にはここでライトを置いたりしてLookDevするのですが
そのあたりは専門家に任せるとして、
私の方ではRenderSettingsを用意して、どうやってKarmaでレンダリングする
部分を試してみます。

Karmaでレンダリングする

Karmaでレンダリングする場合は、Karma Render Properties ノードと
Render ROPノードを使用するか
Karmaノード(RenderProperties+Render ROPノードの機能を持ったもの)を使用します。
今回は、Render Propertiesを使用します(理由はあとで)

RenderPropertiesノードを使用すると、

https://graphics.pixar.com/usd/docs/api/usd_render_page_front.html
UsdRenderスキーマを利用したレンダリング設定Primが作成されます。

当然ながら、Karma用のRenderSettingsが色々ふえてはいるものの
スキーマはUSDのRenderSettingsに準拠しており、
その情報もUSDとして保存されています。

UsdRenderSettingsの構成

UsdRenderスキーマは、大きく分けて3つのスキーマで構成されています。
それが、 UsdRenderSettings UsdRenderProduct UsdRenderVar です。

UsdRenderSettings

まずはRenderSettings。
これはその名の通り、レンダラーの主要な設定(この場合Karmaの設定)を持ちます。

Primのプロパティを確認すると、このようにKarma用の設定が羅列されています。

RenderProduct

次がRenderProduct。
これは、いわゆるレンダリングするイメージ(画像)ごとの情報
つまりは、画像の出力先であったり拡張子だったり、解像度だったりの情報が
RenderProductPrimに保存されています。

このRenderProductは、RenderSettingsの products にリレーションで指定されています。

レンダリングする画像の設定をするところ、、、ということで
カメラの設定もRenderProdcutに指定します。
指定方法は camera に対して、リレーションで camera Prim を指定します。

UsdRendervar

最後にRenderVar。
これはいわゆる AOV(Arbitary Output Variable)のことで
レンダリング時に各要素ごとを分けて出力するときの設定になります。

デフォルト状態の場合は、Beautyが指定されています。

Image Outputの中から、出力したい要素をチェックすると、

その設定だけ、 RenderVarPrimが追加されます。

AOVの指定は、画像に対して(カメラごとに対して)指定されるので
設定はRenderProductの orderedVars にリレーションで指定されます。

ここまでがUSD的な構造の話でした。

Karma Render Properties

上のようなUSDのPrimの設定をするLOPのノードが「Karma Render Properties」で
このノードを使用すると、どこのPrimに何を設定するとか
どういうふうにリレーションを作るかとかを
気にせずに指定することができます。

例えば OutputPicture や Camera 、OuptutImagesでAOVの指定だったり。
変更に応じてUSDのPrimを生成します。

Render ROP

RenderSettingsができたので、実際にレンダリングをしてみます。

USD Render ROP ノードには、 Render Settings というパラメーターがあるので
ここで、先程指定したRenderSettingsを指定します。

指定をすれば、 Karma Render Properties ノードで指定した設定で
レンダリングをすることができます。

USD ROP

ここまでで、大まかな流れがわかりました。

この中で重要な点というのは「RenderSettingsはUSDとして保存される」という
部分です。

今回は レンダリングするシーンで Render Properties ノードを使用して
設定をしていたわけですが、USDで保存しているということは
別のUSDとして保存して、それをコンポジションして使い回すことができるわけです。

まずは、こんなかんじで Render Propertiesノードの結果をUSD ROPで出力します。

そしてそのUSDをLoadLayerで読み込みます。
こうしておくことで、複数のShotで共通のRenderSettingsを使用できるようになります。

カメラの変更

上の例のままだと、カメラやMeshなどがRenderSettingsに含まれてしまっているのであまりよろしくありません。

ので、USD ROPでRenderSettingsのみを分離して構築してみます。
RenderSettingsのレイヤーを構築するためのノードがこちら。

間にConfigureLayerノードを追加して、DefaultPrimを指定しておきます。

このように、RenderSettingsのみのレイヤーが作成されました。

作成したレイヤーをリファレンスで読み込みます。
こうすることで、共通で使用するRenderSettingsが変わっても
自動でアップデートできるようになります。

次にカメラ設定を変更します。
シーングラフのRenderProductPrimのアトリビュート一覧にある「camera」を
右クリック→Edit Propertyを選んで

Edit Propertiesでcameraを指定します。

あとはそれをRender ROPに繋げば準備は完了です。

このEdit Propertiesが、Shotごとの調整をするレイヤーになっていて
基本は共通のRenderSettingsのレイヤーの情報を使うけど
Shotごとに違うパラメーターをもたせたい...みたいなことも
USDのコンポジションで指定ができるようになっています。

AOVの調整

さらに、AOVのせっても足してみます。

どうするかというと、Karma Standard Rendervarノードというのがちゃんと用意されているので、ノードを作成してMerge(サブレイヤー)します。

そして、先程と同じように Edit Properties ノードを作成して
Set or Createに変更して、orderedVars を
/Render/Productes/Vars/* のようにします。

こうすると、Vars以下にあるRendervarPrimがすべて指定されるので
あとは、StanderdVarノードで使用するAOVを指定します。

まとめ

orderedVarsやProductなどはすべてリレーションで指定されているので
ListEditingできるからいくらでもレイヤーを分割したりしながら
柔軟に設定を作れるというのがわかりました。

今回はHoudiniのノードでやっているので、camera設定などはやや冗長ですが
そこもPythonを使ったりすればいい感じにできるとおもうし
cameraを別レイヤーとして出力して
決められたSdfPath上にリファレンスで配置する...などすることで
いい感じに構成することもできそうです。

大昔にレンダリング周りをMayaでやっていたときは、
レンダリング設定を管理したりするのがものすごく面倒だった記憶があるので
USDを利用すれば、Houdini SOlARISでのレンダリング管理や
シーン構築がかなりシステマチックにできるようになるんじゃないかと思います。