OptiXを用いたレンダリング例(2)~Intersection Programの例

続いて、もう一つのOptiXプログラマブルシェーダ「Intersection Program」について見てみよう。

Intersection Programはやってきたレイを衝突したと見なすかどうかを制御するプログラムだ。衝突したら前出のClosest Hit Programが起動するというのは既に述べたとおり。

衝突判定は、レンダリング対象のポリゴン(三角形)で形成された3Dモデルと取るのが一般的な手法となるわけだが、この衝突判定に幾何学を導入することが面白いことが実現できる。丁度、Closest Hit Programでプロシージャルテクスチャを定義したように、Intersection Programをプロシージャル技術で定義することで、任意の形状、いわばプロシージャル3Dモデルを定義できるのだ。

Intersection Programはレイとの衝突を司るプログラマブルシェーダ

下の図、ここまでのサンプルに登場してきた四角柱の右隣にある薄緑色のガラス製の六角柱はゼロポリゴンのモデルだ。これの実態の定義はIntersection Programで8平面(上面+下面+6側面)の平面を定義し、やってきたレイに対し、この8平面との衝突判定を行って、その結果でClosest Hit Programを呼び出すようにして実体化させている。

右側の六角柱はゼロポリゴンのモデル。Intersection Programによって書かれたプロシージャル3Dモデルだ

複数平面で閉じた凸状3Dモデル(Convex Hull model)と、レイとの衝突判定は比較的単純に行える。それは、やってきたレイが凸状モデルを形成する各平面に衝突した際、「最後の突入平面」と「最初の脱出平面」をチェックして、その前後関係が、レイの進行方向から見て順行していれば「その凸状モデルに衝突している」と判断できる(逆に、この条件が満たせないときは衝突していないと判断できる)。

ここでは複数平面で表現したが、やろうと思えば高次曲面を導入することも出来る。

ただし、静的な3Dモデルならばともかく、自身が変形する動的モデルをこの手法で表現するのは難しい。なにかの非現実的なエフェクト的な効果としては、こうしたアイディアを導入するのは面白いかも知れない。

複数平面で閉じた凸状3Dモデル(Convex Hull model)と、レイとの衝突判定は比較的単純に行える

そのプログラム例

さて、この薄緑色のガラス製の六角柱の映像を見て「ガラス製のくせにその影が黒すぎる」という突っ込みをしたくなった人もいたはずだ。

例えば、ここの影が黒いのは、視線レイが床面に衝突して、光源方向に新しいレイを投げて、遮蔽を探査した際に、ガラス製の六角柱に衝突して「遮蔽されている」という判断が下って「影」として描画したからだ。

ここで、Any Hit Programのプログラマブルシェーダで投げたレイをさらに進めて、ガラス製の六角柱は衝突はするが半透明なので、さらにレイを進めて、ガラス内部に突入したレイの反射、あるいはガラス外面の鏡面反射による相互反射などに配慮し、レイのエネルギーの減退率を計算すれば、その影を「薄い半影」にすることが出来る。

Any Hit programとはレイが何かに衝突するごとに、レイに対しての次のアクションを定義するもの

Any Hit Programで、何かに衝突したらレイの進行を止めて、エネルギーをゼロにして返す…というシンプルな定義が真っ黒な影を生んでいた

これをレイの進行を継続させ、衝突のたびにエネルギーを減退させるように定義すれば半影表現が出来る。このプログラム例ではフレネル反射に対応した減退率を計算している

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