RayTrace VOP と Gather VOPについて


どうも篠島です。MantraのRaytracingの記事でも軽く紹介しましたが、RayTrace VOP について少し説明したいと思います。そして Gather VOP も簡単に説明します。

 

今回のサンプルファイルです。
RayTrace_Gather.zip

 

RayTrace VOP

RayTrace VOP はその名の通りレイトレースを行うことができるVOPなのですが、使い方は簡単で、シェーディングポイント P から、法線 N の方向へレイを飛ばし、何かにヒットしたらそのオブジェクトのシェーダーを呼び出し、データを取得します。

RayTrace VOPを使った簡単なシェーダーとして下のようなネットワークを作りました。左下のビューポート上にあるグリッドにこのシェーダーを割り当ててレンダリングしたのが右下の写真です。複雑なことは全くしていないので完全に鏡の様に反射していますが、レイがオブジェクトに当たらないと、透明になっている部分がある事に注意してください。

 

グリッドの法線は真っ直ぐなので、オブジェクトから真っ直ぐにレイを飛ばして色を取得しますが、この法線にノイズ等を加えて変化させると、面白い効果が得られます。

 

ノイズのオフセットをアニメーションさせてレンダリングしたのが下のGIFになります。

 

他の作例として、RayTrace VOP で自分で好きな N を設定してレイを飛ばす方向をコントロールすることで非現実的なエフェクトも簡単に作れます。下図のシェーダーネットワークは、赤い矢印で描かれた画面左上に向かってレイを飛ばすように設定したシェーダーです。

レイトレースによって得られる結果は下の様になり、これに壁用のジオメトリと一緒にレンダリングすると、まるで影のように反射の表現ができるのが分かるかと思います。

 

 

Gather VOP

Ray Trace VOP と Gather VOP は似ている所がいくつかありますが、大きな違いは Ray Trace VOP はレイを1本飛ばすのに対し、Gather VOP は sample パラメーターで指定した数だけレイを飛ばす事です。また Gather VOP はループ出来るようになっており、各サンプル毎にループ処理されます。Gather VOP は名前の通りファイナルギャザリングによって擬似的に間接光を表現するのにも使うことが出来ます。

 

レイを複数飛ばして、各サンプルポイントの結果の平均を取ることで、先程の反射のエフェクトをぼかす事もできます。

 

Gather VOP の使い方は Illuminance Loop と似ています。予め変数を Constant VOP で作っておき、各サンプルからの結果を変数に入れてループの外に渡します。

 

ここで注意しなければならないのが、Import という項目を増やすことで、サンプルから得られるデータを変数に好きな数だけ入れられることです。デフォルトでは Import 0 で色情報 Cf だけを取得するようになっていますが、透明度、レイの原点、レイの方向、ヒットしたオブジェクトまでの距離の5つの情報が得られます。

 

Gather VOP 内のループでは、このImport 0 の値が最初に繋がれた変数に入れられ、もし Import 1 があれば2つ目に繋がれた変数にサンプルのデータが格納されます。そのデータを元に、ループ内で処理を指定します。

 

Gather VOP の中に潜り、先程つないだ2つの変数を足し合わせて、出力します。1つ目の変数 value にはサンプルして得られたデータが入っており、sum には最初は空のデータ(0,0,0)ですが、サンプル毎にこの sum にデータが加算されていきます。

 

最終的なシェーダーネットワークは下の様になります。Gatherの出力をサンプル数で除算している所に注目してください。サンプルデータを足し続けたので、割らないと数値が大きくなりすぎてしまいます。詳しくはサンプルファイルを参照してください。

 

補足

Ray Trace VOP も Gather VOP も Mantra の Refract Limit の影響を受けます。デフォルトの10だと不必要に遅くなるので、1 など低い値にしましょう。