Houdini 20.0 レンダリング

ディープカメラマップ

On this page

概要

ディープカメラマップ(Deep Camera Map)とは、カメラとそこから一番近い不透明なサーフェス間の半透明な領域(ボリュームなど)を深度情報付きで保存したレンダリング画像のことです。その画像内の各ピクセルは、シーンの奥行きに沿った透明度の変化のレベルをカーブとして表現しています。これによって、レンダリング画像を合成する際に、半透明な領域が正しく深度に基づいてブレンドすることができます。

ディープカメラは、オブジェクトを横切った非常に透明度の高いオブジェクト(スプライトの集まりと雲などのボリューム)に対して役に立ちます。そのようなオブジェクトはDCMとして別々にレンダリングするべきです。DCMは透明なオブジェクトをそれと作用するオブジェクトとは別にレンダリングすることができるので、より柔軟にコンポジット処理をすることができます。

ディープカメラマップの主な欠点は、ピクセル毎に保存する情報量が大きいので ディスク容量を圧迫する ことです。2K(2048×1080)のDCMフレームは通常で1~2 GB のディスク容量を必要とします。通常の1ショットに掛かるスペースの予算は1 TB ほどです。他の欠点は、コンポジットに追加するので、DCM内のオブジェクトはシャドウを受けることができません。

Houdiniは.ratまたは.exrのテクスチャファイルフォーマットへのDMCの保存のみをサポートしています。同じ画像にディープカメラマップ(ピクセルあたりの深度情報)とディープラスター(追加画像平面)を含めることができます。

How to

ディープカメラマップをレンダリングするには、2つのレンダリングプロパティをレンダードライバノードに追加しなければなりません。

To...Do this

レンダードライバノードをセットアップしてDCMとしてレンダリングする

  1. レンダードライバノードを選択します。

  2. パラメータエディタで、ギアメニューをクリックして、 Edit Rendering Parameters を選択します。

  3. 左側のツリーサブペインで、 Mantra フォルダの Output を開きます。

  4. DCM FilenameDeep Resolverのプロパティを選択して、ボタンをクリックして、 Existing Parameters にプロパティを移動します。これにより、ノードのパラメータインターフェースにプロパティが追加されます。

  5. Accept をクリックします。

  6. Properties タブの Output サブタブをクリックします。

  7. Deep Resolver パラメータを Deep Shadow Map に設定します。 DSM Filename を保存したいRATまたはEXRのファイル名に設定します。例えば、$HIP/textures/$OS_$F_dcm.rat

    ($HIPは現行ファイルを含んだディレクトリです。$OSは現行ノードの名前です。$Fはフレーム番号です。)

レンダリングすると、Mantraは出力画像に 加えて 、DCMを書き出します。

精度とファイルサイズの妥協点をカスタマイズする

いくつかのプロパティでは、DCMファイルサイズを小さくするために深度合成精度を下げることができます。DCM内のオブジェクトが細かくない、またはニアとファーのクリップ平面間の距離が小さい場合、深度合成精度はあまり重要ではないので、それらのプロパティが非常に役に立ちます。

  • DCM Compressionプロパティを追加して、値を上げると、サンプルが多く破棄されます。

  • DCM Z Storageプロパティを追加して、“32 bit float”を“16 bit float”に変更します。これはサンプルの深度を表現するのに使用するビット数を半分にします。

    この設定があまりにも低すぎると、階段状になってしまいます。

  • DCM Z-biasプロパティを追加して、値を上げます。この値の範囲内のサンプルがお互いに結合されます。

2つのレンダリングしたDCMを合成する

DSM Mergeレンダーノードまたはdsmmergeコマンドラインユーティリティを使います。

DCMファイルを平坦な画像に変換する

DSM Flattenコンポジットノードを使います。

シェーダでディープマップを使用する方法

VOPの場合は、Shadow Map VOPを参照してください。

VEXの場合は、teximportdsmpixelの関数を使用することで、ディープマップからディープピクセル情報にアクセスすることができます:

cvex 
dsminfo(string map="foo.rat") 
{ 
   string   names[], name; 
   float   Pz[]; 
   vector   Of[]; 
   vector   res; 
   int      x, y; 

   if (teximport(map, "texture:resolution", res)) 
       printf("%s resolution: %g\n", map, res); 
   teximport(map, "texture:channelnames", names); 
   printf("%d channels:\n", arraylength(names)); 
   foreach (name; names) 
       printf("\t'%s'\n", name); 

   x = res[0] * .5; 
   y = res[1] * .5; 
   if (dsmpixel(map, "Pz", x, y, Pz) && 
       dsmpixel(map, "Of", x, y, Of)) 
   { 
       int      i, n; 
       n = arraylength(Pz); 
       printf("Depth complexity[%d,%d] = %d\n", x, y, n); 
       for (i = 0; i < n; i++) 
      printf("\tZ=%g, Of=%g\n", Pz[i], Of[i]); 
   } 
}

レンダリング

Mantraユーザガイド

基本

ライティング

次のステップ

導師レベル

他のレンダラー