Krakatoa MX 白背景でMatte Objectを使用する
2013年5月8日
こちらのページは、Matte Objectとシャドウのチュートリアルを参考にして学習したときに、白を背景にするとアーティファクトが目立つ原因となります。その解決方法について以下に説明します。
下の画像は、Matte Objectを使用してレンダリングしたパーティクルと、スキャンラインでレンダリングしたジオメトリを、白背景で合成した画像です。
パーティクルとジオメトリの境に、今回の問題点であるフリンジが現れています。
Matte Objectとシャドウの最後に出てくる、Super Samplingの数値を上げても、改善されません。
問題の原因について
Matte Objectの仕様から説明します。
- Matte Objectは、Zデプスバッファにレンダリングされます。そして各ピクセルに、最も近いパーティクルを覆っているピクセルまでの距離が符号化されます。
- Matte Objectを使用してレンダリングした場合、Zデプスバッファから、Matte Objectより後ろにあると判断されたパーティクルは描画されません。
- Matte Objectエッジ付近のパーティクルが描画されるかどうかは、Zデプスバッファの精度に依存します。
この仕様により、
Matte Objectであるジオメトリは、描画範囲として考えると、「Matte Objectに完全に覆われているパーティクル」と同等といえます。
そしてその「Matte Objectに完全に覆われているパーティクル」と、「Matte Objectより完全に手前にあるパーティクル」を重ねたときに、「一部ジオメトリに重なっているパーティクル」が存在しないことになってしまいます。
これが、最初の画像に出てくるフリンジの原因です。
最初の画像の例のように、Matte Objectがパーティクルの内側にも存在する(食い込んでいる)場合には、Matte Objectの後ろにあるパーティクルのコンポジットも必要になります。
このような場合は、Krakatoa レンダラーでMatte Objectを使用している時のみ出力できる、Occluded Particleチャンネルを使用して合成します。
テストシーンの作成
まず、パーティクルとMatte Objectに使用するオブジェクトを作成します。
この例では、下記のような設定を最初に行いました。
- パーティクルはSphereからPRT Volumeを使って作成
- Matte ObjectにするオブジェクトはSphereを新しく作成
- 新規作成したSphereに、不透明度にチェッカーのマップを適用したマテリアルを適用
- ライトを作成して、シーンを照らす
- オブジェクトをパーティクルと一部重なるように配置
マテリアルを適用した方のSphereを選択した状態で、Krakatoa GUIの Matte Objects タブに移動します。
Create Update Named Selection Setボタンをクリックして、SphereをMatte Objectに指定します。
すぐ上のボタンがAll Matte Objects OK – Open Krakatoa Matte Objects Explorer …
に変わっていれば、Matte Objectの指定に成功しています。
この時点でレンダリングした画像です。
Occluded Particleチャンネルのレンダリング設定
次に、Occluded Particle チャンネル出力のための設定を行います。
Occluded Particleチャンネルとは、Matte Objectsによって隠されたパーティクルを出力するチャンネルです。
Krakatoa GUIの>Save Multiple Layersボタンを選択することで、Render ElementsタブにKrakatoa Occluded Layerチャンネルが追加されます。
このまま、レンダリングして、画像を出力します。
レンダリングした画像を、コンポジットソフトで開きます。
二つのパーティクルレイヤーが出力されていることを確認します。
この二つの画像をコンポジットすると、パーティクルをお互いに埋めあって、隙間のないパーティクルが生成されます。
コンポジット
ここから、Video Postで合成した場合と、Nukeで合成した場合の二つの場合にわけています。
最終結果の画像は、どちらの方法で合成しても同じなのですが、重ね方などが違うためです。
Video Post→Nukeの順に紹介します。
Video Postで重ねる場合
構成
先ほど作成した、通常のパーティクルと、隠されていたパーティクル(Occluded Particle)をイメージ入力イベントで追加し、隠されていたパーティクルの画像がリスト中で上になるように並べます。
二つの画像を選択し、イメージレイヤイベントを追加します。アルファ コンポジタを選択して、二つの画像を合成します。
ここまでのコンポジット結果の画像です。
上がRGBチャンネル、下がアルファチャンネルです。
RGBチャンネル
αチャンネル
3ds Maxに戻ります。
同じシーンをScanlineレンダラーでレンダリングして、ジオメトリ画像を作成します。
(レンダリングする前に、画像の解像度が同じであることを確認してください。)
Scanlineレンダラーでレンダリングした画像を追加して合成します。
アルファ コンポジタを一度解除した後、ジオメトリ画像をイメージ入力イベントで読み込みます。
ジオメトリ画像を2枚のパーティクル画像の間に入るように並べかえ、Occluded Particleの画像とジオメトリ画像をアルファ コンポジタで合成、そのアルファ コンポジタとパーティクル画像をさらにアルファ コンポジタで合成します。
これで、フリンジのない合成結果が作成されます。
両面レンダリングしたScanline画像を使用する(Video Post)
KrakatoaのMatte Objectsはデフォルトで両面がレンダリングされていますが、
Scanlineレンダラーのデフォルトはジオメトリの片面のみレンダリングします。
Scanlineレンダラーでの画像も、両面でレンダリングして再構築すると、Matte Objectsの背面も考慮された結果になります。
(Scanlineレンダラーでレンダリング設定の共通設定タブ→オプションの”両面レンダリング”チェックで両面レンダリングを行えます)
白い背景を追加しても、最初の例のようにフリンジが出ません。
この画像は片面レンダリングのジオメトリ画像と差し替えます。
Video Postでの最終合成結果
一番上にあるアルファ コンポジタと、白い背景画像(Photoshopなどで作成が必要です)を、アルファ コンポジタで合成します。
こちらが、最終合成結果画像です。
Nukeで重ねる場合
Node Graph
先ほど作成した、通常のパーティクルと、隠されていたパーティクル(Occluded Particle)を、Readノードで読み込みます。
Mergeノードを作成し、Occluded Partickle画像をBインプットに、通常のパーティクル画像をAインプットにつなぎます。
ここまでのコンポジット結果の画像です。
上がRGBチャンネル、下がアルファチャンネルです。
RGBチャンネル
αチャンネル
同じシーンをScanlineレンダラーでレンダリングして、ジオメトリ画像を作成します。
(レンダリングする前に、画像の解像度が同じであることを確認してください。)
Scanlineレンダラーでレンダリングした画像を追加して合成します。
もうひとつMergeノードを作成して、Merge1(先ほど作成したMergeノードです)にAインプットをつなげます。
Merge1のBインプットにつなげていたOccluded Particleの画像をはずし、代わりにScanlineでレンダリングしたジオメトリの画像をつなぎます。
Merge2のBインプットにOccluded Particleの画像をつなぎます。
これで、フリンジのない合成結果が作成されます。
両面レンダリングしたScanline画像を使用する(Nuke)
KrakatoaのMatte Objectsはデフォルトで両面がレンダリングされていますが、
Scanlineレンダラーのデフォルトはジオメトリの片面のみレンダリングします。
Scanlineレンダラーでの画像も、両面でレンダリングして再構築すると、Matte Objectsの背面も考慮された結果になります。
(Scanlineレンダラーでレンダリング設定の共通設定タブ→オプションの”両面レンダリング”チェックで両面レンダリングを行えます)
白い背景を追加しても、最初の例のようにフリンジが出ません。
この画像は片面レンダリングのジオメトリ画像と差し替えます。
Nukeでの最終合成結果
さらにMergeノードを作成し、AインプットにMerge2ノードを、BインプットにColorを白に指定したConstantノードをつなげます。
こちらが、最終合成結果画像です。



















