Holdoutワークフロー
Holdoutワークフロー
Holdoutの必要性
映画やコマーシャルでは、ライブアクションのプレート上にCGオブジェクトを合成しなければならないことがよくあります。CGオブジェクトが本物で、シーンに属すものであると観客を納得させるためには、holdoutオブジェクトを使用して、ライブアクションのプレートのシャドウや反射に密接に一致するCGオブジェクトのシャドウや反射を集める必要があります。
例えば、ここに、いくつかのCGのティーポット、球形、holdoutオブジェクトとして使用するCG地表プレーンがあります:
環境を撮影して、以下の環境マップを準備しました:
環境球形光源を一次可視性を有効にして作成し、この環境マップに使用します。そして、holdoutオブジェクトを作成して、CGオブジェクトのシャドウと反射を集めます。以下のようなレンダーになりました:
概要
通常は、"holdout"シェーダを使用して、地表プレーンのような選択ジオメトリ上にシャドウと反射を集めます。Mayaユーザーの場合、これはUse Backgroundシェーダに似ています。holdoutジオメトリでは、集められたシャドウは、そのビューティーのアルファチャンネルと置き換わり、他のチャンネルは、そのビューティーのRGBと置き換わります。
RISでは、holdoutは、RIS Bxdfとしてではなく、LPEの接頭辞として実装されています。これは、RMSHoldOutシェーダが事前定義されたマテリアルに限定されるReyesでの実装と異なる点です。LPEとして実装する利点は以下のとおり:- LPEの接頭辞として、BxdfやレイヤBxdfをholdoutジオメトリに割り当てることができます!
- これは、単なるLPEの接頭辞であるため、lpegroupsやライティンググループはholdoutと一緒に働くという意味です。
- これにより、holdoutジオメトリのすべてのマテリアルプロパティを調整したり、(背景プレートが変わった場合に)別のマテリアルにholdoutジオメトリを簡単に再度割り当てたりすることが、柔軟に行なえるようになります。
- 集められたシャドウや反射は、例えば、マテリアルのプロパティを反映します。周囲にあるジオメトリの間接イルミネーションは、holdoutのマテリアルの反応も反映します。
- さらに、LPEの接頭辞として、"holdout"を含むLPE文字列を接頭辞として付けて、これが直接ライティングのみに限定されない限り、シャドウや反射だけでなく、いずれのチャンネルも集めることができます。
- LPE設定が完了している場合、"holdout"の接頭辞を追加/削除することは簡単で、集められたチャンネルをインタラクティブにプレビューできるようになります。
- "holdout"を含むLPE文字列を接頭辞として付けても、AOVのファイル出力に影響はありません。これにより、ターンアラウンドが速くなり、インタラクティブにプレビューすることができます。いったん結果が気に入れば、"holdout"の接頭辞を簡単に削除することができます。LPEを出力したくないが、holdoutを維持したい場合は、LPEの出力ドライバをnullに設定することができます。
- インテグレータだけがライティングの移動情報を把握しているため、LPEの接頭辞としてholdoutを実行することは理にかなっています。これにより、RISのインフラストラクチャを再設計する必要がなくなります。
限定条件
- Holdout LPE接頭辞は、lpegroupを必要とするため、PxrPathTracerインテグレータとのみ働きます。現段階では、lpegroupは、PxrPathTracerにのみ実装されています。
- Holdoutオブジェクトは、現段階では、お互いインタラクティブに作用しています。これを回避するには、別々のパスでholdoutオブジェクトをレンダリングしてください。
Holdoutの設定方法
Mayaの使用
RenderMan for Mayaでholdoutを設定するには、以下の手順に従ってください:
- 地表プレーンのようなholdoutジオメトリにBxdfを割り当てます。これにより、背景に一致するholdoutジオメトリのマテリアルが定義されます。これは、BxdfでもレイヤBxdfでも使用できます。
- holdout用のジオメトリを選択します。
- holdoutボタンをクリックします。
- holdoutの名前を入力します。これは、LPEのディスプレイチャンネル名になります。デフォルトでは、シャドウと反射が集められます。各チャンネルのチェックボックスをクリックするだけで、他のチャンネルも集めることができます。
LPE Groupの名前を入力します。尚、名前の先頭に"collector"を付けてください。インテグレータは、名前の先頭に"collector"が付いていない場合、holdoutのLPEグループを無視します。デフォルトでは、LPEをshadowcollectorとreflectioncollectorとして、事前定義しているため、lpegroupは"collector"に設定されています。
- 既存のlpgroupが存在する場合は、holdout LPEとしてそのまま含まれます。
- lpgroupが存在しない場合、holdoutボタンにより、ジオメトリに接続される共有設定ノードにlpgroupが追加されます。これは、Attribute EditorタブでrmanHoldoutSettingsとして表示されます。
- Createボタンを選択します。これにより、"holdout"の接頭辞が付いたLPEレンダー出力が作成されます。
Holdoutの背景
Mayaのholdoutに"背景"を指定したり、作成したりする方法はいくつかあります。
Image plane(画像プレーン)
アクションは不要です。画像プレーンのトレースセットが存在しない場合、レンダーは、holdoutが動作するように適切なトレースセットを自動的に放出します。デフォルトでは、このトレースセットの名前は"rman__imageplane"です。これは、インテグレータのimagePlaneSubsetパラメータで変更することができます。
独自のトレースセットを追加したい場合は、画像プレーンを選択して、RenderManメニューから以下を選択してください。RenderMan > Create > Create Trace Set
トレースセットを以下に設定します:
rman__imageplane
トレースセットが正しく作成されれば、RenderMan Trace Setがオンになっていることを再確認してください。
Environment Sphere(環境球形)
holdoutの背景を指定するもう1つの方法は、環境球形光源のPrimary Visibilityを有効化することです。これにも、rman__imageplaneトレースセットが必要です。この場合もやはり、レンダラーは、トレースセットが存在しない場合、トレースセットをRIBに自動的に放出します。
"it"で背景を切り替える
"it"を背景画像にするだけで、"it"の2D画像上にholdoutレンダーを合成することができます。
Image > Toggle Background
Katanaの使用
RenderMan for Katanaでholdoutを設定するには、以下の手順に従ってください:
- 地表プレーンのようなholdoutジオメトリにBxdfを割り当てます。これにより、背景に一致するholdoutジオメトリのマテリアルが定義されます。これは、BxdfでもレイヤBxdfでも使用できます。
- いつものようにLPEを設定して、"holdout"の接頭辞を追加します。
シャドウと反射のコレクターに既存のLPE設定がある場合は、LPEの最初に"holdout"の接頭辞を含めるだけです(例: lpe:holdout;shadowcollector)。尚、これはLPEのファイル出力に影響しません。holdoutとファイル出力の両方を使用することができます。
シャドウと反射のコレクターにLPE設定がない場合、"holdout"の接頭辞を付けたLPEを設定する必要があります。
holdoutに使用することができるビルトインのLPE一式があります。ビルトインのコレクションがニーズに合わない場合、holdout用にカスタムのLPEグループを定義することもできます。
ビルトインLPEグループの使用
ビルトインの"collector" lpegroupを使用して、シャドウと反射を集めるholdoutを設定するには、- PrmanObjectSettingsでlpegroupをholdoutジオメトリ用に作成します。尚、名前の先頭に"collector"を付けてください。
- シャドウコレクターのLPEチャンネル用にPrmanChannelOuputDefineノードを作成します。これにより、RiDisplayChannelのチャンネル名が設定されます。
- シャドウコレクターのLPEチャンネル用にPrmanChannelOuputDefineノードを作成します。
- シャドウPrmanChannelOutputDefineノード用にRenderOutputDefineノードを作成します。尚、RenderOutputDefineがそこにない場合、holdoutは処理されません。
- 反射PrmanChannelOutputDefineノード用にRenderOutputDefineノードを作成します。
- PrmanOutputChannelDefineノードをRenderOutputDefineに接続すると、RenderOutputDefineのチャンネル内に追加されたチャンネルがドロップダウンで表示されます。
カスタムLPEグループの使用
例えば"collectorPlane1"のようなカスタムlpegroupを使用して、シャドウと反射を集めるholdoutを設定するには:- holdoutジオメトリ用にPrmanObjectSettingsでlpegroupを作成します。
- シャドウ用にPrmanChannelOutputDefineノードを作成します。
- 反射用にPrmanChannelOutputDefineノードを作成します。
- 各PrmanChannelOutputDefineノードにRenderOutputDefineノードを作成して、PrmanOutputChannelDefineノードを上記のようにRenderOutputDefineに接続します。
- Disk Renderを実行します。holdoutはLPEの接頭辞であるため、Preview Renderを実行すると、holdoutは処理されません。
- "image plane"を作成するには、ジオメトリがPxrConstant Bxdfや放出Bxdfに割り当てられている場合に限り、ジオメトリを使用することができます。現段階では、インテグレータは非放出Bxdfを認識しません。
RIB
"holdout"接頭辞をLPEソースに追加して、Displayを標準AOVとして設定します。尚、holdout LPEを処理するために、Displayが必要です。
Attribute "identifier" "string lpegroup" ["collector"] DisplayChannel "varying color allShadows" "string source" ["color lpe:holdout;shadowcollector"] DisplayChannel "varying color allReflections" "string source" ["color lpe:holdout;reflectioncollector"]
Display "myRender.exr" "openexr" "rgba" Display "+myRender_shadowcollector.exr" "openexr" "allShadows" "int asrgba" [1] Display "+myRender_reflectionCollector.exr" "openexr" "allReflections" "int asrgba" [1]
Light Group(ライトグループ)
Holdoutは、LPEの接頭辞であるため、光源グループもholdoutと一緒に動作します。
RenderMan for Mayaの場合、ライトグループの名前をholdoutチャンネルのSourceに追加するだけです。例えば、"key"という名前のライトグループの場合を説明します。上記のように、holdoutシャドウコレクターを作成します。次に、そのSourceで'key'を<L.>に追加します:
color lpe:holdout;shadows;C[<.D'collector'><.S'collector'>]<L.'key'>
RenderMan for Katanaの場合、ライトグループを設定するサンプルファイル: lightGroupAOVs.katanaがあります。各LPEエクスプレッションに、ライトグループの"holdout"の接頭辞を付けるだけです。
RIBの場合、LPEのライトグループの設定方法に関しては、Light Path Expression を参照してください。