マット/シャドウ オブジェクトとカメラ マップ
はじめに
現実世界のオブジェクトで満たされた既存のフォトグラフィック バックグラウンド プレートに、統合 1オブジェクトを含めることは頻繁にあります。空き地に建設予定の建物を追加する場合、道路に仮想の車を追加する場合、仮想のキャラクタがシーン内を歩き回り、現実世界のシーンのオブジェクトとリアルに相互作用する場合などがその例です。
この機能を実現するシェーダは主に 2 つあります。mip_cameramap シェーダは、イメージをカメラからジオメトリに "投影"します。mip_matteshadow シェーダはホールドアウト マットを生成し、フォトグラフィック プレートの現実世界のオブジェクトによるシャドウの投影と受け取り、および反射と間接照明の受け取りを可能にします。
mip_cameramap
このシェーダを使用すると、サーフェス ポイントのスクリーン上のピクセル座標に基づいて、カラー テクスチャを参照できます。このシェーダは機能の点でライブラリの mib_lookup_backgroundbase に似ていますが、次に示す重要な相違点があります。
- 参照されている座標は、現在レンダーされているピクセルのラスタ位置ではなく、シェーディング ポイントのラスタ空間への"逆変換"によって得られた値です。これは、バックグラウンドが反射と屈折で正しく表示されていることを意味します。
- "ピクセル単位" の一致を実行し、補間によるバックグラウンドのブラーを防ぎます。
declare shader "mip_cameramap" (
color texture "map",
scalar "multiplier" default 1.0,
scalar "degamma" default 1.0,
boolean "per_pixel_match" default off,
boolean "transparent_alpha" default off,
boolean "offscreen_is_environment" default on,
color "offscreen_color"
)
version 4
apply material, texture, environment
end declare
map パラメータは参照されるカラー テクスチャで、multiplier はそのマップの乗数です。
必要に応じて、シェーダは degamma パラメータを使用してテクスチャに逆ガンマ補正を適用できます。ガンマがチェーン内の他のシェーダに制御されているか、グローバル mental ray ガンマが使用されている場合は、値を 1.0 に設定します。これは "変更されない" ことを意味します。
per_pixel_match をオフにすると、単純にシーン全体がテクスチャで覆われます。per_pixel_match をオンにすると、マップの左下のピクセルがレンダー後の左下のピクセルに正確に一致します。マップのピクセル サイズがレンダリングのピクセル サイズと異なる場合は、警告が出力されます。この場合もイメージはレンダーされますが、必要に応じてクロップまたはパディングされます。
シェーダをバックグラウンドとして適用する場合でも、アルファ チャネルから情報を抽出する必要があることがあります。transparent_alpha がオンの場合、アルファ値は常に 0 になります。オフの場合、テクスチャのアルファ値が使用されます。
このシェーダはシェーディング ポイントからラスタ空間への真の "逆変換" を実行します。視点からのレイのスクリーン上の場所には必然的に影響しますが、反射や屈折などには適用されません。これらのレイはスクリーンの外にあるオブジェクトのポイントにヒットしていることがあります。offscreen_is_environment をオンにすると、これらのレイが環境に返されます。オフにすると、offscreen_color が返されます。どちらの場合も、このカラーは multiplier または gamma の影響を受けません。
mip_matteshadow
このシェーダは、次のような目的で "マット オブジェクト" (既存のフォトグラフィック プレートで既存の現実世界のオブジェクトを "表現する" ために使用されるオブジェクト)を作成する場合に使用します。
- ...(統合オブジェクトを現実世界のオブジェクトの背後で動かせるように)別の統合オブジェクトをカメラのビューからブロックする場合。
- ...統合オブジェクトがシャドウを投影したり、現実世界のオブジェクトからシャドウを遮ったり受け取ったりすることを可能にする場合。
- 統合オブジェクトの反射を現実世界のオブジェクトに追加する場合。
- 統合オブジェクトと現実世界のオブジェクトが相互に間接照明の影響を受けられるようにする場合。
上記のすべての場合において、mip_matteshadow は、現実世界のオブジェクトを表現するオブジェクトに適用され、統合オブジェクトは従来のマテリアルを使用します。
このシェーダは "シャドウのみ" のシェーダとしても機能します。これは、入力ライトと比較したポイントのシャドウの暗さのみを表示しますが、実際の入力ライトそのものの量は無視します(遮られた割合のみ)。
declare shader
struct {
color "result",
color "shadows_raw",
color "ao_raw",
color "refl_raw",
color "indirect_raw",
color "illumination_raw"
} "mip_matteshadow" (
color "background" default 0 0 0 0,
# Shadows
boolean "catch_shadows" default on,
color "shadows" default 0 0 0 1,
color "ambient" default 0.2 0.2 0.2,
boolean "no_self_shadow" default on,
boolean "use_dot_nl" default on,
scalar "colored_shadows" default 1.0,
# AO
boolean "ao_on" default on,
color "ao_dark" default 0.0 0.0 0.0,
integer "ao_samples" default 16,
scalar "ao_distance" default 0.0,
# Reflections
boolean "catch_reflections" default off,
color "refl_color" default 0.2 0.2 0.2 0.2,
color "refl_subtractive" default 0.2 0.2 0.2 0.2,
integer "refl_samples" default 0,
scalar "refl_glossiness" default 10.0,
scalar "refl_max_dist" default 0.0,
scalar "refl_falloff" default 2.0,
# Indirect
boolean "catch_indirect" default off,
color "indirect",
# System
boolean "multiple_outputs" default off,
# Additional illumination
boolean "catch_illuminators" default off,
array light "illuminators",
# Extra input
color "additional_color" default 0 0 0,
# Light linking
integer "mode",
array light "lights"
)
version 6
apply material, texture
end declare
注: このセクションでは、パラメータについて手短に説明しますが、ページ matteuseagetips の「使用法のヒント」では、異なる使用事例についてさらに詳しく説明します。
シェーダには複数の出力があります(構造体を返します)。ただし、既定では、(互換性の理由から)構造体の最初のアイテムのみが書き込まれ、その他は複合的な "結果" となります。パラメータ multiple_outputs が有効な場合のみ、その他の出力に対してそれぞれ個別の結果が書き込まれます。
background パラメータは、バックグラウンドのカラーです。どの catch_... オプションもオンになっていない場合は、アルファを含むこの結果が返されるだけで、シェーダはまったく動作しません。それ以外の場合は、このカラーが他のすべての処理のベースカラーとなります。外部合成の使用時、このカラーは一般的に透明な黒(0 0 0 0)になりますが、それ以外の場合は、mip_cameramap シェーダでマッピングされた現実世界のバックグラウンド プレートを使用します。
catch_shadows オプションが有効の場合は、他のオブジェクトがこのオブジェクトにシャドウを投影できます。
shadows パラメータは、シャドウのカラーです。シャドウが検出されると、ポイントがどの程度 "シャドウ内" にあるかに応じて、バックグラウンドとシャドウのブレンドが実行されます。
ambient パラメータは、"基本のライト レベル" を設定します。このパラメータは、最低の "シャドウ内" レベルを引き上げます。たとえば、この値が 0.2、0.2、0.2 である場合、生成される最も暗いシャドウは、バックグラウンドが 20 パーセント、シャドウが 80 パーセント ブレンドされたものになります(アンビエント オクルージョンが有効になっていない場合)。
no_self_shadow オプションを有効にすると(また、シェーダのインスタンスをシャドウ シェーダとして使用すると)、mip_matteshadow を使用するオブジェクトは他の同様のオブジェクトからシャドウを受けられません。
use_dot_nl オプションは、入力ライトの量を計算するときにライトの角度を考慮するかどうかを定義します。
color_shadows が 0.0 の場合、すべてのシャドウはグレー スケールで投影されます。1.0 に設定すると、シャドウはフル カラーになります。たとえば、サーフェスが 1 つの赤いライトと 1 つの緑のライトで照らされている場合、赤いライトには緑のシャドウ、緑のライトには赤いシャドウが付きます。
ao_on が有効な場合、組み込みのアンビエント オクルージョン(これ以降は単に "AO" と呼びます)が、ambient パラメータのカラーに基づいて適用されます。AO は no_self_shadow スイッチを優先し、同じマテリアル インスタンスを持つオブジェクトからの AO を発生させません。
ao_dark パラメータは、AO によるシャドウの暗さを指定します。通常は既定の黒で問題ありませんが、明るい色にすると、シェーディング エフェクトがあいまいになります。
ao_samples は、ショットされる AO レイの数です。AO レイの達成度は、ao_distance パラメータを使用して設定できます。値が 0 の場合、レイは無限遠へ到達します。短いレイはパフォーマンスを劇的に向上させますが、AO エフェクトを局所化します。
catch_reflections は、反射を有効にします。
refl_color は反射の乗数です。このカラーのアルファ値は、その値に応じて反射がアルファに影響を与えるという意味で重要です。場合によっては、反射を減算する必要があります。その場合は refl_subtractive を使用します。詳細については、matteuseagetips を参照してください。
refl_samples パラメータは、光沢反射のサンプル数を設定します。値が 0 の場合は、ミラー反射が使用されます。それ以外の場合は、refl_glossiness が反射の Ward 光沢を設定します。
反射はほとんどの refl_max_dist で表示され、減衰(falloff)のシェイプが refl_falloff である点は、baseライブラリのシェーダ mib_glossy_reflection に非常によく似ています。
オプション catch_indirect がオンの場合、間接照明が集められ、間接カラーでスケールされます(間接カラーは通常、バックグラウンド カラーと同じカラーに設定され、バックグラウンド カラーが間接照明の反射値として扱われます)。
multiple_outputs により、シェーダは返された構造体で複数の値を出力します。
catch_illuminators スイッチがオンの場合、illuminator としてリストされたライトがテストされ、実際にシーンを照らします。これは、background パラメータを拡散カラーとして扱う単純な Lambert イルミネーションです 2。
additional_color は、シェーダ グラフを容易に構築するために、結果に追加されたカラー入力です。すべての用途に使用できます 3。
最後に、mode は、ライトを含む/除外モードを設定します。lights は、他の多くのシェーダと同様に、シャドウを投影するために使用されるライトのリストです。
また、シェーダには複数の出力があります。互換性のため、multiple_outputs パラメータがオンになっていない場合、シェーダは主な出力以外の出力に値を書き込むことはありません。しかし、このパラメータが有効な場合、シェーダは次の値を出力します。
- result: 結合された結果です。
- shadows_raw: 白いバックグラウンドでの未処理のフルカラー シャドウ パスです。"乗算" モードのバックグラウンドの上面で合成を行う場合に適しています。
- ao_raw: 未処理のアンビエント オクルージョンです。
- refl_raw: 未処理の反射です。
- indirect_raw: 結果となる間接照明です。
- illumination_raw: illuminators リストのライトから収集されるライトです。
すべての出力は、ポスト プロダクションでレイヤとして最大限に利用できるように、できる限り "未処理" の状態です。たとえば、反射は反射カラーで乗算されていないことなどです。
mip_matteshadow_mtl
mip_matteshadow を埋め込み、これをマテリアルのサーフェス、シャドウ、およびフォトン シェーダとして適用するマテリアルの現象です。このシェーダのパラメータは mip_matteshadow と同じですが、スカラーの不透明度が追加されています。
不透明度はシャドウやフォトンには適用されず、可視のサーフェス シェーディング自体のみに適用されます。不透明度を使用することにより、不規則なエッジにペイント マスクを使用できます。たとえば、シンプルなテーパ円柱を作成して大まかに前腕に一致させ、腕の実際の輪郭はカメラ投影マスク(mip_cameramap を使用して適用)で表現します。また、マスクを利用して、バックグラウンド プレートに存在する可能性のあるモーション ブラーに一致させることもできます。
使用法のヒント
このセクションでは、現実世界のフォトグラフィック プレートと統合オブジェクトを結び付けるシェーダについて説明します。次に示すキッチン カウンタの写真を例にして説明します。このキッチン カウンタには、使い古したプラスティックの塩入れやスパイスを入れた瓶、一枚の紙やその他のものが置かれています。

これは、バックグラウンドに使用する写真です。この写真はまだレンダリングされていません。
カメラ マッピングの説明
baseライブラリの mip_cameramap と mib_lookup_background の違いは何でしょう。
主な違いは、前者が現在のラスタ位置(現在レンダーされているピクセルの x 座標と y 座標)のみを使用するのに対し、後者はシェーディング ポイントのイメージ空間位置を実際に計算する点です。
それがなぜ問題になるのでしょうか。例を挙げてみましょう。バックグラウンドの上面にある平面にマップされた反射球で、2 つの異なるシェーダを使用した場合の例を次に示します。

mib_lookup_background

mip_cameramap
mib_lookup_background を使用した左側のイメージがどう誤っているのか判断してください。これは、反射ではなく透明に見えます。この原因は何でしょう。
球上にあるピクセル座標 200,200 をレンダー中であるとします。この球をヒットする視点からのレイが送られます。このヒット ポイントは、ピクセル座標 200,200 上にあります。しかし、レイは反射レイとして地表プレーンをヒットし続けます。
この(地表プレーン上の)新しいポイントは、レンダー中のピクセルと同一のものではなく、モデル内のどこか他の場所にあります。それでも、mib_lookup_background は、現在のピクセル(200,200)のみを対象として、マップからのポイントにカラーを返します。
反対に、mip_cameramap は、実際にはこの新しいポイントを新しいラスタ座標設定(例: 129,145)に変換し、その新しい位置でマップを参照して反射の正しい外観を作成します。
ただし、反射ポイントがスクリーンの外部にある場合はどうなるのかという潜在的な問題が存在します。計算されたラスタ座標が(-45, 39)の場合はどうなるのでしょう。この場合、mip_cameramap は指定されたカラーを返すか、offscreen_is_environment がオンの場合は、そのレイの方向の環境カラーを返します。
マット オブジェクトとシャドウの受影
このセクションでは、mip_matteshadow を使用して、現実世界のジオメトリの代替オブジェクト("マット オブジェクト" とも呼ばれます)を作成します。この例では、イメージの左側にある使い古しの塩入れと、キッチン カウンタ自体を対象とします。次に示すシンプルな 3D モデルが構築されます。

バックグラウンドのシンプルな 3D モデル
mip_matteshadow を使用せずに、たとえば、バックグラウンドを標準の Lambert サーフェスに単にマップしようとすると、次のような結果になります。

Lambert シェーダへのバックグラウンドのマッピング
Lambert シェーディングが、現実世界のイメージ上に既に存在しているシェーディングの上面に適用されるため、明らかに不出来な結果となります。ここで必要なことは、シャドウをシェーディングから分離することです。
これは、mip_matteshadow を使用して実行できます。白のバックグラウンドと黒のシャドウを持つシェーダを適用した結果を見てみましょう。

未処理のシャドウ情報
このイメージには、未処理のシャドウ情報が含まれ、それ以外は白になっています。この操作モードは、外部合成に非常に役立ちます。統合オブジェクト(ここではトーラス)をカメラに対して非表示にし、白のバックグラウンドと黒のシャドウで mip_shadowmatte を使用することにより、完全に分離したシャドウ パスを生成できます。
注: この使用法では、色付きシャドウがサポートされています。赤と緑のライトがある場合、緑のライトは赤のシャドウを表示し、赤のライトは緑のシャドウを表示します。
上に示したイメージには、1 つの問題があります。塩入れのシャドウが含まれている点です。しかし、現実世界の写真には、既に塩入れのシャドウが含まれています。この問題は、次の手順に従って解決します。
- mip_matteshadow をマテリアルのシャドウ シェーダとして適用します。
- その no_self_shadow オプションをオンにします。

自身に影を投影しない mip_matteshadow マテリアル
シェーダがマテリアル シャドウ シェーダとして使用され、no_self_shadow がオンの場合、mip_matteshadow を使用するオブジェクトは mip_matteshadow を使用する別のオブジェクトにシャドウを投影しませんが、他のオブジェクトにはそのままシャドウを投影するため、他のオブジェクトもこのオブジェクトに対してシャドウを投影します。
しかし、シャドウが非常に暗くなります。塩入れに投影されたトーラスのシャドウの左エッジが暗すぎることに注目してください。これを解決するには、アンビエント カラーを低い値に設定し、use_dot_nl をオンにします。これにより、シャドウがライトに対して垂直になるにつれて "フェード アウト"するため、エッジが暗くなりすぎることがありません。

use_dot_nl をオンにして薄くなった影
この時点で、mip_cameramap を使用して、白のカラーをバックグラウンドで置き換えることができます。

白の代わりに使用されたバックグラウンド
シャドウの高度な受影
シャドウは、mip_matteshadow を使用して、さまざまな方法で処理できます。白のバックグラウンドと黒のシャドウ設定を使用してシャドウ パスを作成する方法については、既に前のセクションで説明しました。
また、バックグラウンドに写真を使用し、シャドウに黒を使用する方法も紹介しました。
ここでは、さらに 2 つのオプションについて説明します。
1 つは、バックグラウンドに明るく照らされたシーンの写真を使い、もう 1 つは、shadow パラメータで設定したシャドウに覆われたシーンの写真を使います。

明るく照らされたシーン

シャドウに覆われたシーン
このテクニックは、すべてのセルフ シャドウ問題を完全に解決するために特に有用です。このモードでは、no_self_shadow をオフにしても問題ありません。以下に結果を示します。

明るく照らされていない方の写真から取得したシャドウ
これによって詳細が見事に表現され、シャドウの "正しい" カラーと強度を、調整する必要なく自動的に得ることができます。
最後の方法は、シャドウを外部合成で完全に処理するやり方です。これは、バックグラウンドを 0 0 0 0 (透明な黒、アルファはゼロ)、シャドウを 0 0 0 1 (不透明な黒、アルファは 1)に設定することで実現できます。
これによって以下のようなレンダリングが作成されます。

カラー チャネル

アルファ チャネル
シャドウ情報がアルファ チャネルにあるため、このイメージは、バックグラウンドの上面で外部的に合成できます。
反射
mip_cameramap を使用しているため、バックグラウンド オブジェクトの反射と屈折は正しく機能します。

反射と屈折
塩入れの反射までもが正しく表示されていることに注目してください。
これは、ファイナル ギャザリングがバックグラウンドを間接光として正しく取得することも意味しています。

ファイナル ギャザリングによって照らし出されたオブジェクト
シェーダはその他のオブジェクトの(光沢)反射も表示できます。

光沢紙によるオブジェクトの反射
反射は、追加された実際の統合オブジェクトのみに影響すること、シェーダは、現実世界の写真にその他の現実世界のオブジェクトの反射が含まれていることを想定済みであること、つまり、mip_matteshadow オブジェクトは、他のオブジェクトも環境も反射しないことに留意してください。
まだ、捉えきれていない詳細が 1 つ残っています。円柱が紙以外に何も反射していないことに注目してください。これは、mip_matteshadow が、"スクリーン外" のどこかで地表プレーンをヒットするレイをどのように処理してよいのかわからないために発生します。

反射なし
この問題は、mip_cameramap の offscreen_is_environment パラメータを使用し、環境マップ(たとえば mip_mirrorball など)を利用して環境マップを提供することで解決できます。

改善後
シェーダは、ファイナル ギャザリングや(フォトン シェーダとしても適用されている場合は)フォトンなどの間接照明も受け取ることができます。これを実証するために、catch_indirect を有効にして、白いオブジェクトを発光色の赤に変え、ガラス球がコースティクスを生成することを確認します。

間接照明の受け取り
上に示すように、シェーダは、1 つのマット オブジェクトから別のマット オブジェクトへ間接照明を跳ね返すこともなく、環境から間接照明を受け取ることもありません(これら両方のエフェクトは、オリジナルの現実世界の写真に存在することが想定されているため)。
最後に、バックグラウンドの写真に既に大量の反射が含まれている特殊なケースについて説明します。反射率の高いサーフェスの上面にある新しいバックグラウンド写真を以下に示します。

反射率の高いサーフェス上にある塩入れの写真
このシーンに統合オブジェクトを追加し、光沢紙で使用したものと同じ設定を使用すると、次に示すような、多少奇妙な外観になります。

反射の加算: 適切に見えない外観
しかし、この外観は適切ではありません。追加された反射を通してバックグラウンドの反射を確認できます。反射を追加すると、外観がまぶしすぎる結果になります。
この問題を解決するには、refl_subtract を使用して、反射によるバックグラウンドの減衰(attenuation)量を設定します。これは当然、イメージ内の反射領域(つまり、家の前の水たまりのようなもの)を一致させるペイント マップとなります。

反射の減算: 大幅に改善された外観
これが正しい結果です。統合された反射は既存の反射をオーバーライドして置き換わります。また、現実世界の反射の内部で現実世界のオブジェクトの背後にあるオブジェクトの反射までもが正しく機能していることにも注目してください(塩入れの背後にある白いボールは、反射の中でもその背後にあります)。
最終的には、すべてのオブジェクトが、バックグラウンド プレートそのものに基づいて間接光を取得します。レンダリングには 1 つの矩形領域の光源のみが存在します。
反射とアルファ
外部合成に備えてバックグラウンドに透明な黒を、シャドウに不透明な黒を使用する場合は、反射にもアルファ チャネルを適用することが重要です。
refl_color パラメータのアルファ コンポーネントは、アルファ チャネルに存在する反射の量を定義します。
同様に、indirect パラメータのアルファ コンポーネントも、アルファ チャネルで表示できる間接光の量を定義します。
バックグラウンドのアルファが 1.0 の場合(つまり、バックグラウンド写真の使用時)は、どちらのパラメータも機能しません。
両方の世界に最適なモード
統合オブジェクトが現実のオブジェクトを反射する必要があり、シャドウを外部で合成するための柔軟性も必要な場合(つまり、レンダー中にバックグラウンドで追加を行わない場合)は、混成アプローチを使用できます。
これは mip_rayswitch シェーダを使用して実現できます。このシェーダを使用して、視点からのレイ用の透明な黒(0 0 0 0)のバックグラウンドの使用と、その他のレイ(反射、屈折、ファイナル ギャザリングなど)用のカメラ マップ写真の使用を切り替えます。
結論およびワークフローのヒント
ここでは、統合オブジェクトをバックグラウンド プレートにレンダリングするための、シンプルで段階的なワークフローを示します。前提条件として以下のものが必要です。

あらかじめ用意しておくもの
- バックグラウンド プレート
- 同じカメラ アングルから撮影されたミラー ボールの写真 4
後は次の手順に従います。
- mental ray のカメラ環境に mip_rayswitch_environment を配置します。
- その バックグラウンド スロットで、mip_cameramap をバックグラウンド プレートとともに マップ スロットで使用します。
- 環境スロットで、mip_mirrorball をミラー ボールの写真とともに マップ スロットで使用します。
- 地表プレーンを作成し、mip_matteshadow を、その地表ブレーン上のサーフェス、シャドウ、フォトン シェーダとして使用します。
- mip_cameramap の同じインスタンスを、そのbackground パラメータで使用します。
- ライトを追加して "現実世界" のライティングを模倣するか、環境に基づいたファイナル ギャザリングを使用するか、これら両方を組み合わせて適切なシェーディングを行います。
- mip_matteshadow の ambient パラメータを設定し、ao_distance を調整して、アンビエント オクルージョンを調節します。
- "グラウンド" が一般的な間接照明をキャッチする必要がある場合は、catch_indirect を有効にして、バックグラウンドのマップを間接にも接続します。

シェーダ ツリー
CG オブジェクトを、物理的に妥当なシェーダ(アーキテクチュラル ライブラリの mia_material など)を使用して追加します。レンダーを実行します。スマイル。

レンダーを実行。スマイル。
脚注- 1
-
"統合" という用語はシーンに挿入される追加のオブジェクトを示し、"現実世界" は既にそこにあるオブジェクトを示します。
- 2
-
lights と illuminators の違いは、lights はバックグラウンドにシャドウを作成する目的のみに使用されるのに対し、illuminators はバックグラウンドに実際にライトを照射するために使用される点です。lights 配列には、既にバックグラウンド プレートに存在するライトが含まれますが、illuminators 配列には、CG 要素で導入されたすべての追加ライトが含まれます。たとえば、CG の車のヘッドライトなどです。
- 3
-
たとえば、拡散カラーを黒に設定して mib_illum_phong にプラグインすることで、スペキュラ ハイライトを illuminator に追加する場合などです。
- 4
- ミラー ボールの写真を少し露出不足にしている場合は、ダイナミック範囲が低い写真で代用できます。