OptiXを用いたレンダリング例(3)~Ray Generation Programの例

ここまでのサンプルでは画面上のピクセルからレイを視錐台方向に飛ばした、いわゆるピンホールカメラモデルのレイトレーシングであった。

OptiXではこのレイを投げる部分もプログラマブルとなっていて、これを司るのがRay Generation Programというプログラマブルシェーダだ。

Ray Generation Programはレイの投げ方を定義できるプログラマブルシェーダ

このレイの投げ方を全方位に球面状に投げることで全方位映像をレンダリングすることが出来る。

なんだか見た目が面白いだけで、一見、何の役にも立ちそうに思えないかも知れないが、この機能を活用すれば、たとえば相互反射や大局照明に対応した環境マップをレンダリングするためにOptiXを使うことも出来る。リアルタイムでこの機能を活用するには無理でも、例えばゲーム開始時のステージ構築の際に固定環境マップを生成するのには十分活用できることだろう。

通常の視錐台方向へのレイ生成

全方位、球面状にレイを生成

動画
ここまでの結果をムービーとしたもの

この全方位レイ照射は奇抜すぎるにしろ、例えば、この視錐台上のピクセルから投げるレイを複数にしてアンチエイリアス処理に役立てるようなことは出来る。

アンチエイリアス処理はRay Generation Programを工夫することでプログラマブルに実装可能

グローバルイルミネーション(大局照明)は、どのように実装すればいいのか。

Parker氏は下図のようなシンプルかつ強健なアルゴリズムを提唱した。

まず、Ray Generation Programでは、視錐台方向に各ピクセルにつき一本のレイを飛ばしていたピンホールカメラモデルとは違い、適当な複数方向に何本もレイを投げるようにする。

そして、投げたレイが衝突したら、その材質ごとの反射特性をデータ化したBRDF(Bidirectional Reflectance Distribution Function:双方向反射率分布関数)をサンプルして、このBRDF値を元にしてその反射レイを求めてその方向にレイをさらに投げる。

そして、このレイが衝突した先の、直接光によるライティング結果を持ち帰る。

以下その繰り返し……となる。

大局照明に対応したレイトレーシングをOptiXで行うには?

動画
この手法で実装された大局照明に対応したOptiXベースのレイトレーシング。リアルタイム……とまではいかないまでも、十分にインタラクティブなパフォーマンスが実現できている