Mantra での Z-Depth 出力は、カメラからの距離を Pz (Position Z) イメージプレーンに出力する。つまり、カメラに近ければ値が小さく、遠ければどこまでも大きくなり、値は Near および Far クリップの間で正規化されない。この挙動は RenderMan や Arnold などと同じ。
反対に Maya, Mental Ray, VRay などでの Z デプス出力は、Near Clip を 1、Far Clip を 0 とした空間で正規化される。つまり、Near Clip に近ければ値が大きく、Far Clip に近づくほど黒くなり、値は常に0と1の間。
ここでは、Mantra からの Z デプスの出力方法とその値を Houdini の COP (Compositing Op: 合成モジュール) を使って Maya や VRay のZ デプス空間に変換する方法を紹介する。
使用バージョン: Houdini 15.0.322
参考シーンファイルへのリンクは一番下にあり。
おおまかな流れ
1. シーン作成
オブジェクトの配置
複数のオブジェクトが前後関係を持って配置されていれば何でも良いが、ここでは、sphere を grid と copy ノードでコピーし、grid にMountain ノードを追加して Y 方向にランダムに配置。
作成したオブジェクトの Render タブで "Render Polygons as Subdivision (Mantra) をオンにしておく。添付シーンを参照。
カメラの作成
- Lights and Cameras シェルフの Camera ツールを Ctrl キーを押しながらクリックすると、現在の視点にレンダリング用のカメラ (/obj/cam1) が作成される。
- 作成されたカメラの View タブ以下に Near Clipping と Far Clipping のパラメータがある。
- Near Clip よりカメラに近いはビューポートにもレンダリング時にも描画されない。
- この二つを調整し、シーン内のオブジェクトが Near Clip と Far Clip の間にぴったりと収まるようにする。
- 添付のシーンの場合、Far Clip を24以下にすると最後の球が見えなくなる。
2. レンダリング & Z-depth の出力
- Render View パネルに行き、カメラを /obj/cam1 にして Render ボタンをクリックすれば、レンダリングが実行され、また /out/mantra_ipr ノードが作成される。
- Render View でイメージプレーンを見ると、デフォルトで存在するのは C (Color) と Op_Id と Prim_Id の3つで、Pz (Z デプス) はない。
よってこれを追加する必要がある。
Z-depth の出力
Mantra ノード (/out/mantra_ipr ) で Z デプスを追加する方法は二つある。どちらも Mantra ノードの Images -> Extra Image Planes タブ以下で行う。
- Extra Image Plane をマニュアルで定義する方法
- Export Components で "Shading Depth (Pz)" をオンにするだけ (#1 をワンタッチで行えるようにした方法)
- Extra Image Planes が 0 の場合、値を 1 にして一枚追加。
- VEX Variable に Pz と入力。タイプしても右側のリストから選択しても良い。
- VEX Type を Float Type に (デフォルトのまま)。
- Quantize は "32 bit float" に。
- Sample Filter を "Closest Surface" に。
- Pixel Filter にリストから "Closest Sample Filter" を選択。そうするとフィールドに minmax min と入力される。
Export Components で Pz をオンにすると、これらの操作がボタン一つで可能。レンダリングの結果はこちら。
見てわかるとおり、手前が黒く、遠くに行くほど白くなっている。これを次のステップで反対にする。
- ちなみに 'i' キーを Render View パネル内で押すと、インスペクタが表示され、各値をピクセル単位で見ることが出来る。
次に進むために、Mantra ノードの Render to Disk ボタンをクリックして画像を一枚ファイルとして出力する。
併せて、Render Viewのレンダリングは をクリックして終了する。
3. COP による Z-depth の変換
- Composite View に移る。すると、ネットワークビューは、/img/comp1 に移動しているはず。
- File ノードを作成。先ほどファイルとして出力したレンダリング画像を読み込む。ノード名は読み込んだファイル名に変わる。
- 作成した File ノードの出力から TAB-> VEX -> VEX Filter を実行。vopcop2filter1 が出来る。
- VEX 以下には Filter と Generator の2種類があるが、Filter は既存ノードの入力を操作し、Generator は新しくデータを作成するときに使用する。
- Mask タブに行き、Plane Scope のRGBA をオフにして、Pz をフィールドに追加する。これで、このノードは Pz プレーンのみに作用する。
- 'i' キーを押すなり、ダブルクリックするなりして中に入る。この時点での Pz は以下の通り。
- global1 の Cr から TAB-> Filt Range を実行。
- fit1 の Shift 出力を output1 の Cr に接続。
- Destination Min を 1
- Destination Max を 0
ただしまだ正規化されていない。正規化にはカメラの Near Clipping と Far Clipping パラメータの値を使う。 - ネットワークビューで /obj/cam1 を選択、パラメータビューの Near Clipping を RMB クリックし、Copy Parameter を実行。
- 再び /img/comp1/vopcop2filter1/fit1 に戻り、Source Min 上で RMB クリックし、 Paste Copied References を実行。
Near Clipping に ch("/obj/cam1/near") とエクスプレッションが入力される。 - このエクスプレッションを選択してコピー、Far Clipping にペースト、最後の near を far に変える。この二つの実行後、fit1 のパラメータは以下の通り。
- Composite View の右下の Adapt To Full Pixel Range ボタン (赤枠内) をクリックすると、結果は以下のようになる。
これでわかるのは、球のZの値が反転した反面、オブジェクトの無い元々真っ黒だった部分が白くなったこと。これを修正しなければならない。 - 再び global1 の Cr から TAB->Utility->Compare を実行。compare1 が作成される。
- Test は Equal (==) のまま。
- Compare to Float の値も 0 のまま。
- compare1 の bool 出力から TAB->Utility->Switch を実行。switch1 が作成される。
- input1 に fit1 の出力を接続。
- TAB->Utility->Constant を実行し、constant1 を作成。値は 0 (デフォルト) のまま。これを switch1 の input2 に接続。
- switch1 の result 出力を output1 の Cr につなぎ直す。
- /obj/cam1 に戻り、Near Clipping を 0.56、Far Clipping を 24とした場合、Composite View の画像は以下のようになる。
- Render View 同様、'i' キーを Composite View パネル内で押すと、インスペクタが表示され、各値をピクセル単位で見ることが出来る。
まとめ
- Z デプスの出力は、Pz イメージプレーンを追加することで行う。以下の 2つの方法のいずれかで可能。
- Extra Image Plane を作成、Pz を登録しマニュアルで定義する方法 (Pixel FilterとSample Filter の設定に注意)
- Export Components で "Shading Depth (Pz)" をオンにするだけ (#1 をワンタッチで行えるようにした方法)、要 15.0.322 以降。15.0.321 以前の場合、これを使うと Pz が16ビットになる。
- 出力した Pz は COP の中で変換。
- Fit Range ノードの Source Min と Source Max をそれぞれ、カメラの Near Clipping と Far Clipping とリンクすると、カメラのクリッピング変更に応じて画像の Z デプスも変更される。
- シーンファイル:
- NEW: h185_zdepth_cop.zip (2.27MB)
チャネルの変換
Z 値などを 16 bit float から 16 bit int に変換するには Convert ノードを使うと良い。Convert ノードで
- Raster Depth を 16 Bit Integer with B/W Points
- Black/White Points を 0 と 65535 (2^16 -1)
- Scope を Pz
I キーで確認すれば、55310 などのように整数で Pz が格納されているのがわかる。
リンク
- Karma でのデプスの設定: Karma | A Beautiful Game の 9番目を参照のこと。
最終更新: 2024-02-23
0 件のコメント:
コメントを投稿