レイ トレーシング

反射

指定されたカラーの反射レイを投影し、結果を入力カラーとマージします。これは、イルミネーションを提供するベース シェーダに反射のエフェクトを追加する場合に、他のベース シェーダによって追加された屈折や透明度と組み合わせるなどして使用できます。反射レイを投影できない場合(トレース デプスが超過している、反射レイによって呼び出されるはずのシェーダが失敗する、notrace パラメータが設定されているなど)は、環境が設定されていればこれをサンプリングします。

mib_reflect
    color "mib_reflect" (
        color           "input",
        color           "reflect",
        boolean         "notrace")
input
このカラーに対して反射を合成します。

reflect
input に対して反射をブレンドする RGBA カラーです。透明な黒は反射レイを投影せずに input カラーを返し、不透明な白は input カラーを評価せずに反射カラーを返します。
notrace
true に設定した場合は、シェーダは反射レイを投影せずに、環境がサンプリングされます。

屈折

屈折のインデックス付きで指定されたカラーの屈折レイを投影し、結果を入力カラーとマージします。屈折のインデックスは、mib_refraction_index などの別のベース シェーダを使用して計算することもでき、このベース シェーダは再び適切な状態変数に格納されます。これは、イルミネーションを提供するベース シェーダに屈折エフェクトを追加する場合に使用します。

mib_refract
    color "mib_refract" (
        color           "input",
        color           "refract",
        scalar          "ior")
input
このカラーに対して屈折を合成します。
refract
input に対して屈折をブレンドする RGBA カラーです。透明な黒は屈折されたレイを投影することなく input カラーを返し、不透明な白は input カラーを評価せずに屈折カラーを返します。
ior
屈折のインデックスの割合です。入力されるオブジェクトのインデックスを出力されるオブジェクトのインデックスで除算します。これはレイが出て行く方向をコントロールします。0 の場合は 1 が使用され、屈折度が透明度に削減されます。

透明度

指定されたカラーの透明度レイを投影し、結果を input カラーとマージします。これは先ほどの関数で屈折のインデックスを 1 とした場合と似ています。

mib_transparency
    color "mib_transparency" (
        color           "input",
        color           "transp")
input
このカラーに対して屈折を合成します。
transp
input に対して透過率をブレンドする RGBA カラーです。透明な黒は透明度レイを投影せずに input カラーを返し、不透明な白は input カラーを評価せずに透明度カラーを返します。

続行

指定されたカラーのレイを続行し、結果を入力カラーとマージします。目的は、現在の交差が存在しないかのようにレイを継続させることです。ボリューム計算に使用されるトレース デプス、レイのタイプ、距離は変更されません。典型的な用途としては、展示室の壁です。展示室の外部にカメラを設置した場合に、展示室の壁が無視されるようにします。

mib_continue
    color "mib_continue" (
        color           "input",
        color           "transp")
input
続行されたレイをこのカラーに対して合成します。
transp
input に対して透過率をブレンドする RGBA カラーです。透明な黒はレイを投影せずに input カラーを返し、不透明な白は input カラーを評価せずに透明度カラーを返します。

不透明度

指定された強度の透明度レイを投影し、結果を入力カラーとマージします。先ほどの機能と似ていますが、透明度の代わりに不透明度が与えられます。不透明度は 1.0 - transparency と定義されます。

mib_opacity
    color "mib_opacity" (
        color           "input",
        color           "opacity")
input
このカラーに対して屈折を合成します。
opacity
input に対して透過率をブレンドする RGBA カラーです。不透明な白は透明度レイを投影せずに input カラーを返し、透明な黒は input カラーを評価せずに透明度カラーを返します。

誘電体

屈折の一種で、追加の鏡面反射(スネルの法則)を持ちます。このシェーダは誘電性マテリアルの屈折のみを担当します。ハイライトは他のイルミネーション ノードに委ねられます。

mib_dielectric
    color "mib_dielectric" (
        color           "input",
        color           "absorb",
        scalar          "refract",
        scalar          "ior")
input
このカラーに対して屈折を合成します。
absorb
サーフェスの外側の吸収係数を指定します。
refract
屈折を input にブレンドします。値が 0.0 である場合は屈折されたレイを投影せずに input カラーを返し、値が 1.0 である場合は input カラーを評価せずに屈折カラーを返します。
ior
屈折のインデックスの割合です。入力されるオブジェクトのインデックスを出力されるオブジェクトのインデックスで除算します。これはレイが出て行く方向をコントロールします。0.0 の場合は 1.0 が使用され、屈折度が透明度に削減されます。

ボリューム フォグ

単純なフォグ シェーダです。このシェーダは先に実行されていたシェーダ(通常はレイの末端にあるマテリアル シェーダ)の結果のカラーに対して作用し、レイの長さに応じて徐々にフォグ カラーに移り変わって行きます。移り変わりは最大距離の範囲内で行われますが、そうでないとフォグ カラーが単色のように見えます。フォグ カラーには、フォグの最大不透明度を制限するアルファ値を持たせることができます。たとえば、フォグ カラーをテクスチャシェーダにアタッチすると、透明なボリュームに煙や炎などのエフェクトを作成できます(移り変わりを回避するには max を 0 にします)。
mib_volume
    color "mib_volume" (
        color           "color",
        scalar          "max",
        boolean         "lightrays")
color
フォグのカラーです。作成されるシェーダのカラーは、レイの移動距離に基づいて、このカラーへと徐々に移り変わります。
max
移り変わりが発生する場所の最大内部空間距離です。この距離を越えると、フォグは単色であるとみなされます。
lightrays
true の場合はシェーダは光線にも適用され、それ以外の場合は光線については作用しません。正確な結果を得るためにはこのオプションは必ず有効にする必要がありますが、光線が非常に多い場合にはコストがかかります。

レイ マーチャ

レイ マーチャは、所定のレイのポイントからの光線を投影し、光源からボリュームを通過する光に対する、ボリュームの影響を求めるテクニックです。mi_sample_light のようなシェーダ インタフェース機能を使用する代わりに、タイプ shaderの入力パラメータとして与えられたシェーダを呼び出します。レイ マーチングではまず、レイの始点と終点の間の一定の間隔のポイントを呼び出し、次いでポイントとポイントとの間を適宜さらに分割します。この分割は、2 つの隣り合ったサンプルが与えるカラーが所定のコントラストしきい値より小さければ、所定の分割限界に到達するまで続行されます。最終的にウェイト付けされた和が返されます。

mib_ray_marcher
    color "mib_ray_marcher" (
        shader          "shader",
        scalar          "distance",
        integer         "num",
        integer         "subdiv",
        color           "contrast")
shader
個々のサンプリング ポイントで呼び出されるシェーダです。ここで返されるカラーは、シェーダが失敗(false を返す)しない限り、返された合計値に追加されます。
distance
2 つの初期サンプルポイントの間の最大内部空間距離です。distance が 0 の場合は、最大距離の強制は行われません。
num
指定された距離での初期のサンプル数です。この数が 0 である場合は、初期のサンプル数は指定されず、代わりにレイ マーチャは最小距離に依存します。いずれも 0 である場合は、デフォルトの数は 4 になります。 num に 0 以外の数字を指定する場合は、2 (レイの両端)以上でなくてはなりません。
subdiv
初期サンプル密度の再帰的再分割数を指定します。0 の場合(デフォルト)は再分割は行われず、レイ マーチャは初期サンプル ポイントに制限されます。値が 1 以上である場合は適応型のサンプリングが行われ、個々の再分割のレベルは、distance を 2 で除算したものになります。最大値は 16 です。
contrast
2 つの隣接するサンプルの間の絶対的な相違の方が大きくなると、別のサンプルが中間に取り込まれます。続いて、コントラストが十分に低くなるか、再分割の制限に到達するまで、両サブセグメントに対して処理を再帰的に繰り返します。

両面

ジオメトリのどちら側にヒットしたかによって、1 つまたは他方の入力カラーを選択します。これは一般には、front パラメータおよび back パラメータに個別の 2 つのマテリアル シェーダを割り当てて、複合マテリアル シェーダとして使用されます。

mib_twosided
    color "mib_twosided" (
        color           "front",
        color           "back")
front
正面側にヒットした場合に返されます。
back
背面側にヒットした場合に返されます。

屈折インデックス

レイが、ヒットしたオブジェクトに入射するか出て行くかを、親のレイのスキャンに基づいて決定します(シーン内に先端の 1 つの軸だけに位置合わせされたコーンなどの不安定なジオメトリが含まれている場合は信頼性に欠けるため、法線ベクトルを基準にしない)。屈折比のインデックス(出て行くレイの屈折を入射の屈折で除算したもの)が返されます。この影響で、入射の屈折インデックスと出て行く屈折インデックスはいずれもその状態で(それぞれ ior_in および ior に)格納され、レイが進入する場合は現在のボリュームシェーダが屈折ボリュームになります。

mib_refraction_index
    struct {
        scalar          "ior",
        boolean         "enter"
    } "mib_refraction_index" (
        scalar          "mtl_ior")
ior
返される屈折インデックス比で、屈折ベース シェーダまたは誘電体シェーダでそのまま使用できます。
enter
レイがオブジェクトに進入する場合は true です。ほとんどのシェーダではこの情報は必要とされませんが、この情報を使用することでベース シェーダはさらに多用途になります。
mtl_ior
レイがヒットしたマテリアルの屈折のインデックスです。レイが進入または出て行くオブジェクトの光学プロパティを記述したもので、レイがオブジェクトに進入する場合には新しい屈折のインデックスとして返されます。

光沢

このセクションで説明するシェーダは、光沢のある(ブラーがかかった)反射および屈折を生成する場合に使用します。これらのシェーダと物理 DGS シェーダとのパフォーマンスおよび有用性の相違点をまとめると、以下のようになります。

マルチサンプリングされた光沢

DGS シェーダは、イメージ全体のオーバー サンプリングによって(パフォーマンスの低下を伴いながらも)魅力的なブラーに使用するサンプルを平均化するために、反射および屈折に使用する単一の光沢のレイを放出します。すべてのレイは新しい独立したサンプルです。

一方、mib_glossy_* シェーダは複数の光沢のレイをサンプリングし、イメージ全体ではなく、光沢のあるサーフェス上でのみオーバーサンプリングを発生させます。サンプルは mental ray の厳密なサンプリング エンジンを使用して作成されるため、サンプル数が同じでも、「より外観の良い」ブラーを作成可能な、より魅力的なサンプル パターンを作成することができます。


DGS(左)と mib_glossy_reflection(右)

上の図は samples 0 1 を使用してレンダリングしたもので、左側の図では、粗い結果がはっきりと見えます。滑らかな結果を得るためには、イメージ全体のサンプリングを増加する必要があります。一方、mib_glossy_* は光沢のあるサーフェスのオーバーサンプリング(この例では 8 サンプル)を処理し、光沢のあるサーフェスそのものだけに適用します。

距離にバインドされた反射/屈折

反射の場合は厳密に言うと非物理ですが、mib_glossy_* シェーダでは反射レイおよび屈折レイの到達する距離を制限することができます。このため、距離がある反射/屈折オブジェクトによって発生するイメージ ノイズを排除し、パフォーマンスを 大幅に 改善することができます。


無制限の反射(左)と距離制限のある反射(右)

環境のアンダーサンプリング

mib_glossy_* シェーダの目的の 1 つに、遠方にあるオブジェクトをフィルタリングし、マテリアル(屈折の場合)または環境(反射)と置き換えることによって、遠くのイメージ をあまり詳細にしないということがあります。しかし、たとえば環境のサンプリングからの過度のノイズを回避するために、反射シェーダは意図的に環境を単一サンプリングして(また事前にブラーをかけておいた環境を明示的に渡されることによって)ノイズを除去することができます。

明示的な UV ベクトルを必要としない異方性

シェーダは明示的に渡された UV ベクトルを使用して光沢のある異方性反射/屈折を行うことができますが、ベクトル自体が失われている(0,0,0 に設定されている)場合は、検知したベクトルについてシェーダ自身が計算を試みます。

法線ベクトルの摂動

DGS シェーダはスペキュラの反射方向または屈折方向を計算し、shiny パラメータによって決定される範囲内でこの方向を摂動させます。一方、 mib_glossy_* シェーダは、反射または屈折の前に、サーフェスにマイクロファセットが存在するかのように光沢をシミュレートします。つまり、反射方向または屈折方向は、法線ベクトルを実際に摂動させる(微細なレベルで粗いサーフェスをシミュレート)ことによって計算され、変更後の法線に基づいて新しい反射方向または屈折方向を計算します。

この結果として異なる結果が生じ、光沢がビュー方向に依存することになります。このことは注意が必要です。たとえば、床における反射の光沢パターンは垂直方向に引き伸ばされます。これは、日没時に太陽光が水面に反射すると、太陽光が垂直に伸びていくように見えるのと同じエフェクトです。


DGS(左)と mib_glossy_reflection(右)

フレネル エフェクト

反射マテリアルのほとんどは、角度が浅いほど反射量が多く、透明マテリアルは正対した時のほうがより透過して見えます。この反射と透過の再均衡化は「フレネル エフェクト」として知られています。これらのシェーダでは、「エッジ」(浅い視射角)と「ベース」(正対)に異なるウェイトを設定して、このエフェクトをエミュレートすることができます。mib_glossy_* シェーダでは、反射全体のグローバルなウェイト付けではなく、サンプルごとにこのエフェクトの計算を行うことにより、いっそうリアルさを向上しています。


フレネル エフェクトなし(左)と強調したフレネル エフェクト(右)

右のイメージのエッジ(浅い視射角のサーフェス)における反射量が左のイメージよりも多いことが見て取れます。

色収差

mib_glossy_* シェーダには、「擬似色収差」の量を設定する dispersion パラメータがあります。このエフェクトは物理的に正確なものではなく、現実の現象をエミュレートするものに過ぎません。

光沢のある反射

光沢のある反射に使用するシェーダです。シェーダに接続されているベース マテリアルに光沢のある反射を追加します。

mib_glossy_reflection
    color "mib_glossy_reflection" (
        shader          "base_material",
        color           "reflection_color",
        scalar          "max_distance",
        scalar          "falloff"                default 2.0,
        color           "environment_color",
        scalar          "reflection_base_weight" default 0.2,
        scalar          "reflection_edge_weight" default 1.0,
        scalar          "edge_factor"            default 5.0,
        shader          "environment",
        boolean         "single_env_sample"      default true,
        integer         "samples"                default 16,
        scalar          "u_spread"               default 0.5,
        scalar          "v_spread"               default 0.5,
        vector          "u_axis",
        vector          "v_axis",
        scalar          "dispersion"             default 0.0,
        array color     "spectrum"
    )
    apply material, texture
    version 3
  
base_material
反射の追加先とするベース サーフェスです。ここには、たとえば mib_illum_phong や、その他のサーフェスシェーダを追加することができます。
reflection_color
反射強度(および色付け)を定義します。計算された反射にはこの値が単純に乗算されます。
max_distance
ゼロに設定した場合は、反射レイの到達距離は無限になります。ゼロよりも大きい値の場合は、反射レイの到達距離はこの距離に制限され(パフォーマンスが大幅に向上します)、反射のカラーはレイの長さがこの距離に近づくにつれて環境カラーへと徐々に移り変わります。このパラメータを使用すると、パフォーマンスを改善し、離れた距離にある高コントラスト オブジェクトによる過度のノイズを回避することができます。
falloff
環境への移り変わり(溶け込み)の度合い(べき関数)を設定します。減衰は、デフォルトの 2.0 では距離の 2 乗となり、3.0 に設定すると距離の 3 乗、というようになります。このパラメータは、max_distance がゼロである場合は無効です。
environment_color
レイが何のオブジェクトにもヒットすることなく環境に到達した場合の乗数です。物理的な正確さを実現するためには、この値を reflection_color と同じ値にする必要がありますが、オブジェクトの反射と環境の反射との間のブライトネスのバランスを緻密にコントロールするために、個別の値を設定することもできます。
reflection_base_weight
カメラに正対しているサーフェスにおける反射で使用するスカラー乗数です。同様に、reflection_edge_weight はカメラに垂直なサーフェス(すなわちエッジ部)で使用し、edge_factor はこの「エッジ」の幅です。一般に、エッジ(浅い角度)における反射量は、正対しているサーフェスよりも多くなります(フレネル効果)。
environment
この シェーダにのみ適用される明示的な環境シェーダを受け渡すためのパラメータです。何も渡されない場合は、マテリアルの環境シェーダが(グローバルカメラ環境を代替として)使用されます。このため、事前にブラーをかけておいた環境マップを特別に準備しておき、環境反射として使用することができます。
これは、環境マップにすでに十分なブラーがかけてある場合は(パフォーマンスの面で)無駄な処理になるほか、環境を複数回サンプリングした場合には不要なサンプリング ノイズの原因となる可能性があります。single_env_sample がオフの場合は、環境サンプルはオブジェクトにヒットしなかった個々の反射レイ用に作成するか、max_distance を使用している場合には環境と混合される必要があります。オンの場合は、環境はこれらの反射レイについて 1 回だけサンプリングされます。
samples
使用されるサンプル数を設定します(2 の累乗が望ましい)。ゼロの場合は、シェーダは単一のサンプル ミラー反射のみに戻ります。
u_spread
v_spread
U 方向および V 方向に行われる法線ベクトルの摂動の量です。この 2 つの値が同じである場合は、光沢のある等方性反射が生成されます。この 2 つの値に何らかの差異がある場合は、異方性モードが有効になります。
u_axis
v_axis
異方性の方向を指定するオプション パラメータです。いずれも異方性モードでのみ適用されます。u_axis が 0,0,0 である場合は、シェーダはサーフェスの最初の導関数ベクトルに基づいてデフォルトのベクトルを生成しようと試み、そのようなベクトルがない場合はオブジェクト空間の X 軸に基づいて生成します。u_axis に値が指定されている場合は、異方性の U 方向として使用されます。v_axis も指定されている場合は V 方向として使用されますが、指定されていない場合は、V 方向は元のサーフェス法線と U 方向の外積として計算されます。
dispersion
0.0 (色収差なし)から 1.0(全色収差)までの範囲です。
spectrum
dispersion パラメータがゼロ以外である場合にカラーの分割先となる「虹」を定義するカラーの配列です。デフォルトでは赤 - 黄 - 白 - シアン - 青 - インディゴの各カラーですが、任意に変更できます。

光沢のある屈折

このシェーダは mib_glossy_reflection と似ていますが、いくつかの相違点があります。これは屈折を扱うため、環境ではなく「deep material」が存在します。


灰色がかった「deep material」へと移り変わる
mib_glossy_refraction
    color "mib_glossy_refraction" (
        shader          "top_material",
        shader          "deep_material",
        shader          "back_material",
        boolean         "render_reverse_of_back_material",
        color           "refraction_color",
        scalar          "max_distance",
        scalar          "falloff"                default 2.0,
        scalar          "refraction_base_weight" default 1.0,
        scalar          "refraction_edge_weight" default 0.2,
        scalar          "edge_factor"            default 5.0,
        scalar          "ior"                    default 1.0,
        integer         "samples"                default 16,
        scalar          "u_spread"               default 0.5,
        scalar          "v_spread"               default 0.5,
        vector          "u_axis",
        vector          "v_axis",
        scalar          "dispersion"             default 0.0,
        array color     "spectrum"
    )
    apply material, texture
    version 2
top_material
最上位のレイヤのサーフェス特性です。このシェーダの反射バージョンにある base_material と同じように、これは結果に対して単純に加算されます。使用例としては、鏡面反射性だけを持ち、拡散コンポーネントをほとんど持たない mib_illum_phong があります。
deep_material
max_distance がゼロ以外である場合にのみ使用されます。オブジェクトの「内部」のサーフェス特性であり、屈折が max_distance に到達するにつれて移り変わっていくカラーです。カラーの計算はサーフェスで 行われますが、内部オブジェクトのすべての屈折の後方に「表示」されます。面白みのある擬似ボリューム計測シミュレーションを行いたい場合には、ここで misss_fast_* サブサーフェス スキャタリング シェーダを使用すると良いでしょう。
back_material
オブジェクトの内部に内側からヒットするレイ(つまりジオメトリ法線によって定義される後面からオブジェクトにヒットしたレイ)で使用されるマテリアルです。これはオブジェクトの「内部」の外観を定義するもので、mib_illum_phong など、サーフェス シェーダに先行パラメータを割り当てる必要があります。デフォルトでは、mental ray は入射レイの側面方向に法線をフリップしてオブジェクト サーフェスの内面をレンダリングします。しかし、シェーディングを定義している、オブジェクトの外面に光をヒットするようにしておくことで、半透明エフェクトをシミュレートしたい場合もあります。このような場合は、render_reverse_of_back_material をオンにして、back_material を評価するときにサーフェス法線の元の方向をシェーダに使用させます。

後面マテリアルの法線ベクトルを意図的にフリップすることで半透明性をシミュレート
refraction_color
屈折されたレイの単純な乗数です。
max_distance
屈折されたレイの到達距離の制限です。距離が max_distance に近づくにつれて、deep_material へと移り変わっていきます。設定された距離までしか透過されない、半透明のマテリアルの外観を得ることができます。
falloff
deep_material への移り変わりの度合い(べき関数)を設定します。減衰は、デフォルトの 2.0 では距離の 2 乗となり、3.0 に設定すると距離の 3 乗、というようになります。このパラメータは、max_distance がゼロである場合は無効です。
refraction_base_weight
カメラに面しているサーフェスにおける屈折で使用するスカラー乗数です。同様に、refraction_edge_weight はカメラに垂直なサーフェス(エッジなど)で使用し、edge_factor はこの「エッジ」の幅です。一般に、エッジ(浅い角度)における屈折量は、正対しているサーフェス上の屈折量よりも少なくなります。これは、「フレネル効果」と呼ばれます。
ior
屈折のインデックスです。屈折の摂動の計算は摂動した法線ベクトルに基づいて行われるので、この値で理にかなった屈折のインデックスを定義するということは非常に重要です。そうでなければ、インデックスが 1.0 である場合にレイの方向は変更されず、ブラーも一切生成されません。特殊なケースとして、ior を 0.0 に設定すると、「法線摂動モード」から「方向摂動モード」に切り替えることができます。
samples
使用されるサンプル数を設定します(2 の累乗が望ましい)。ゼロの場合は、シェーダは単一のサンプル屈折のみに戻ります。
u_spread
v_spread
U 方向および V 方向に行われる法線ベクトルの摂動の量です。この 2 つの値が同じである場合は、光沢のある等方性屈折が生成されます。この 2 つの値に何らかの差異がある場合は、異方性モードが有効になります。
u_axis
v_axis
異方性の方向を指定するオプション パラメータです。いずれも異方性モードでのみ適用されます。u_axis が 0,0,0 である場合は、シェーダはサーフェスの最初の導関数ベクトルに基づいてデフォルトのベクトルを生成しようと試み、そのようなベクトルがない場合はオブジェクト空間の X 軸に基づいて生成します。u_axis に値が指定されている場合は、異方性の U 方向として使用されます。v_axis も指定されている場合は V 方向として使用されますが、指定されていない場合は、V 方向は元のサーフェス法線と U 方向の外積として計算されます。
dispersion
0.0 (色収差なし)から 1.0(全色収差)までの範囲のパラメータです。
spectrum
dispersion パラメータがゼロ以外である場合にカラーの分割先となる「虹」を定義するカラーの配列です。デフォルトでは赤 - 黄 - 白 - シアン - 青 - インディゴの各カラーですが、任意に変更できます。


Copyright (©) 1986-2008 by mental images GmbH