Houdini 20.0 レンダリング

Absorption(吸収)とNested Dielectrics(入れ子状の絶縁体)

異なるシェーダが定義されたジオメトリが重なっている時にそこから自動的にジオメトリを“抜き出して”、その内部に別々のシェーディングプロパティを割り当てることができます。

On this page

Mantraユーザガイド

Absorption(吸収)

光がグラスなどの透明な媒体を通過すると、そのマテリアルが特定の波長を吸収した結果、光線に“色が付きます”。この効果は、ステンドグラスやフルーツジュースのように媒体に色味がある時が理解しやすいでしょう。

Mantraを使ってレンダリングする時、光がオブジェクトを通過する時にボリュームを使ってその光を減衰させるといった色々な方法でこの効果を模倣することができます。 しかしながら、最も簡単なのは、Principledシェーダ(ClassicシェーダとローレベルのPBR Nonmetallicノードも同様)の2つのシェーダパラメータを使用する方法です:

Transmission Color

光線がオブジェクトを通過した時に、その光線をこのカラーで色付けます。 色付ける量は、光線がオブジェクト内を通過した距離に依存します。 At Distance を使用することで、その色付けをスケールすることができます。

At Distance

光線が完全に Transmission Color の色になるには、その光線がオブジェクト内をこの距離だけ通過する必要があります。 距離が短いほど色合いが弱く、距離が長いほど暗くなって、より色合いの強い Transmission Color の色になります。

光線が透明なオブジェクトを通過していくと、At Distanceの値に応じてTransmission Colorの色味が“累積”されていきます。この光線が不透明なオブジェクトに当たると、その評価されたサーフェスカラーとその累積の色味が合成されます。

この方法を使えば、Mantraは複数の重複していない透明オブジェクトに対して吸収カラーを累積することができます。 ( 重複 した透明オブジェクトに対する解決策は、以下のNested Dielectrics(入れ子状の絶縁体)を参照してください。) 吸収の色味の値は、不透明オブジェクトのカラーで合成される前に乗算されます。

光線は、吸収を起こさせるために透明オブジェクトを抜ける必要がありません。 例えば、透明オブジェクトの中に不透明オブジェクトが埋め込まれている場合、その光線は不透明サーフェスに当たるまで吸収カラーを累積します。

透明オブジェクトは、閉じたサーフェスである必要がありません。 光線は、グラスの窓を表現した平面などの開いたサーフェスから色を取得することができます。 (開いた透明サーフェスは、光に作用 しない ことに注意してください。つまり、透明な平面を通過した光を見てみると、その光には色が付いていないことでしょう。 光に色味を付ける必要がある場合、透明オブジェクトに奥行きを足すか、ライトの代役として発光ジオメトリを作成してください。)

色味の付いた光線が最終的に不透明オブジェクトに当たらなかった場合、Mantraは、その吸収情報を破棄して、ブラックのカラーを返します。 実質的にMantraは、開いたサーフェスを、すべての光を吸収する無限大に奥行きのある透明オブジェクトとして扱います。

“At Distance”値とスケール

吸収を使ってシェーダを使用する時は、色味の量が ワールド空間ユニット でオブジェクトを通過した距離に基づいていることを覚えておいてください。 つまり、 オブジェクトのスケールがレンダリング結果に大きく影響してしまう ということです。

吸収を使うときは、レンダリングシーンの実際のスケールでオブジェクトのルックデブを行なってください。 サンプルのオブジェクトのシェーダを1スケールでセットアップし、そのシェーダを別スケールのジオメトリに適用してレンダリングすると、同じルックが得られません。

吸収とカメラ位置

Mantraは、光線がカメラ正面で透明サーフェスを通過した時にのみ色味の吸収の追跡を開始します。 これは、光線がオブジェクトに入って抜け出るまでの吸収を追跡することができます。 ただこれは、透明オブジェクトの中にカメラが配置されていると、期待通りの結果が生成されません。 この場合では、光線がカメラから離れて球を抜け出ますが、その光線は球の外側から中に入っていないので、まったく吸収の追跡が開始されず、オブジェクトから色味が得られません。

吸収とボリューム効果

吸収は非常に単純ですが、透明な媒体を通過する光の減衰を効果的に表現することができます。 しかし、吸収は本当のボリューム効果ではないので、すべてのタイプの照明効果を表現するのには適切ではありません。

いくつかのオブジェクトでは、光の減衰は媒体内を浮遊した微粒子によって引き起こされます。これらの微粒子は、光を吸収し散乱させます。海のように大きな流体効果について考えてみましょう:

海洋面は吸収によって現実味のある深さを表現しているのに対し(中央の画像)、本当のボリュームレンダリング(右の画像)は、実際の海の特徴的な光の散乱のみを表現します。 しかし、ボリュームは吸収サーフェスよりもレンダリングが遅いので、品質 vs. レンダリング時間を考慮することになります。 ほとんどの場合、スイミングプールや浅い川のように、必要となるルックを得るのには、吸収で十分かもしれません。

Nested Dielectrics(入れ子状の絶縁体)

異なったジオメトリのボリュームが重ならないようにサーフェスのモデリングをやり直したとしても、それらのサーフェスが同一にはならなかったり、少し隙間が発生します。

完全に一致したサーフェスをシェーディングしたとしても、精度誤差で必ず正しくシェーディングされるわけでもなく、隙間は物理的に正しい結果を生成しません。 ましてや、このモデリングは面倒で誤差が生じやすい方法です。それなら、サーフェスを重ねるだけの方が非常に簡単です。

その答えが Nested Dielectrics です。シェーダ毎に 優先度 を設定し、レンダリング時に複数のシェーディングサーフェスが重なっていると、その中で最も優先度の高いシェーダ(複数可)だけがそのサーフェスに寄与するようになります。

Nested Dielectricsは、レンダリング時に簡易的なブール演算として動作します。優先度の高いシェーダが他のシェーダの 代わりに 実行されるので、実質的に、その重なったジオメトリからジオメトリのボリュームが“抜き出される”ことになります。

この場合では、気泡とグラスの優先度をコーラよりも高くしたとします。これによって、コーラからグラスと気泡を“抜き出す”ことができます。氷の優先度が気泡よりも高くしたとします。これによって、コーラ内で気泡をばら撒き、気泡と氷が重なった箇所で気泡を氷で上書きすることができます。つまり、氷が存在する箇所に気泡をばら撒かないように注意する必要がありません。

To...Do this

レンダーノードのNested Dielectricsを有効にする

  1. メインメニューから Render ▸ Edit render node ▸ name を選択します。

  2. パラメータエディタで、 Rendering タブをクリックして、 Shading サブタブをクリックします。

  3. Enable absorption and nested dielectrics を有効にします。

Nested Dielectricサポートは、若干パフォーマンスとメモリを消費します。必要になるまでは有効にしない方が良いでしょう。

Nested Dielectricシェーダをセットアップする

  • ビルトインのシェーダには、優先度パラメータ/入力があり、入れ子にする時のシェーダの優先度を設定することができます。例えば、Principled Shader VOPSurface タブの “Transparency”に Surface priority パラメータがあります。

  • 独自のシェーダを構築している場合、その優先度は、反射と屈折を制御するPBR Non-metallicノードの入力になります。

優先度の数値が低いほど、優先度が 高く なります。例えば、優先度1のシェーダは、優先度2のシェーダを上書きします。

Surface Priority(サーフェス優先度)

透過マテリアルを重ねた時にシェーディングされるサーフェスのその位置での優先度の順位。 0の値は、サーフェス優先度が無視されることを意味します。 低い数値(優先度が高い)のサーフェスは、高い数値(優先度が低い)のサーフェスを“上書き”します。 Mantraは、指定した領域内の最高優先度のオブジェクトに対してのみシェーダを計算するので、重なった同じ空間内では、高い優先度のオブジェクトが低い優先度のオブジェクトを上書きして消す効果を作成します。

このレンダリングでは、赤い球と青いボックスが同じサーフェス優先度です。これでは、どのサーフェスが内側で外側なのかをMantraが区別できないので、屈折と吸収で問題を起こします。

この例では、赤い球が青いボックスよりも優先度が高い(低い数値ほど優先度が高い)ので、その赤い球がその青いボックスからボリュームを“削り取ります”(単にMantraは、その球に重なったそのボックスの部分を無視します)。 これで、青いボックス内に埋め込まれている赤い球の吸収と屈折が正しくなりました。このセットアップは、水の中に浮いている氷のようなものに対して上手く動作します。

この例では、青いボックスの方が優先度が高くなるようにサーフェス優先度の値を切り替えました。 これは、青いボックスに重なっている赤い球の部分を消す効果があります。このセットアップは、グラスの表面上に存在している水滴のようなものに対して動作します。

このパラメータは、MantraレンダーノードEnable Absorption and Nested Dielectrics が有効になっている時にのみ効果があります。

Dispersion(分散)

光学系では、光が屈折マテリアルを通過した時に、その光の成分が波長別に分かれることを分散と呼んでいます。 この現象の典型的な例は、光が分散プリズムを通過して生成されるスペクトルです。

Mantraでレンダリングする時、Principledシェーダ (ClassicシェーダとローレベルのPBR Nonmetallicノードも同様)の Dispersion パラメータを上げることで、この現象を模倣することができます。

Dispersion

屈折光に見られる波長のスペクトル効果をシミュレーションするために、屈折光線を広げて色を付けます。 この値が大きいほど、スペクトルの分離が大きくなります。

このパラメータをゼロ以外の値に設定すると、屈折光線に可視スペクトルの単一波長がタグ付けされます。 これらの波長は、大元の屈折率(IOR)を変更するので、その屈折光線が屈折マテリアルを通過すると分離されます。

Mantraは、波長をランダムに割り当てます。とはいえ、Mantraは可視スペクトルがPixel Sample毎に均一にサンプリングされるように試みます。

Mantraは各光線に1つの波長をタグ付けするので、スペクトル全体を表現するのに十分なサンプルがあることが重要です(Mantraレンダーノードの Secondary rays パラメータを使用)。

以下の図では、3本のセカンダリ光線による1個のピクセルサンプルが適切に可視スペクトルを網羅できていないことが分かります。 これでは、各ピクセルサンプルがランダムな波長の分散を返すので、ほぼ確実に最終レンダリングにノイズが発生してしまいます。

セカンダリ光線の数を増やすほど、1個のピクセルサンプル内に可視スペクトルが増えて良くなります。これによって、ピクセルからピクセルへの整合性が良くなり、レンダリング内のノイズが少なくなります。

以下のレンダリングシーケンスは、セカンダリ光線の数によるDispersion(分散)のノイズの減り方を示しています。各レンダリングは、1, 5, 25, 100本のセカンダリ光線を示しています。

分散ノイズを除去する方法

ほとんどの場合、レンダリングのノイズは、あるピクセルから別のピクセルへの明度(輝度)の小さな変化によるものです。 シェーダに分散がある時、このザラザラしたルックは、輝度ノイズにさらにカラーノイズが加わることで目立ってしまいます。

この例では、どちらとも同様のサンプリング不足ですが、右側の画像の方がノイズが露呈しているように見えます。 これは、輝度の小さな変化が、カラースペクトルのサンプリング不足に起因するカラー内の劇的な変化ほどまったく気にならないからです。

球の白い領域をよく見てみると、非常に類似したノイズパターンノイズが見受けられます。とはいえ、右側の画像はノイズの色の性質上、劇的にノイズが多いように見えます。

分散ありのオブジェクトのサンプリング量は、分散なしの同様のオブジェクトよりも増やさなければならないことが多いです。

以下の例では、両方のオブジェクトで同様のノイズ量になるようにするには、大幅に多くのサンプリングが必要となることが分かります。

このクローズアップでは、球体の白い領域が非常に類似したノイズレベルとパターンがあることが分かります。 これは、ホワイトカラーに収束するのに十分なほどの可視スペクトルがサンプリングされているからです。しかし、この結果を得るのに2倍のサンプル数が必要でした。

このサンプリングの違いを知っておけば、分散を有効にした透明オブジェクトのRefraction Qualityパラメータを上書きする時に役立ちます。 このように、余分な屈折サンプルを必要とするオブジェクトにのみ、その余計な屈折サンプルを送信すると良いです。

Mantraユーザガイド

レンダリング

Mantraユーザガイド

基本

ライティング

次のステップ

導師レベル

他のレンダラー