ニュース
ゲームグラフィックスにおけるレイトレーシングの基本的な概念
過去にも使った図だが,イメージしやすくするために,レイをロケットに置き換えた概念図(図1)をもとに説明してみよう。
この図は,レイトレーシングにおける3種類の典型的な処理を示している。
1つめの処理は,図の上側にある「1-a」〜「1-c」にあたり,あるピクセルに光が当たっているかを調べるものだ。あるピクセルから飛ばしたロケット(=レイ)が光源に到達したら,発射元のピクセルに光が当たっていると判断できるので,プログラマブルシェーダを呼び出して,ピクセルの陰影具合を計算する。
2つめは,図の下側にある「2-a」〜「2-c」で,あるピクセルが影になっているかを調べるものだ。光源に向けて飛ばしたロケットが何かに衝突したのであれば,発射元のピクセルは光源から何かに遮蔽されていることになるので,影になっていると判断できる。そのため,該当のピクセルは暗い色で描くことになるわけだ。
3つめは,図の右側にある「3-a」〜「3-c」で,あるピクセルに何かが映り込んでいないかを調べるものだ。光が当たっていると判断したピクセルから,視線の反対方向にもロケットを飛ばす。もし,ロケット発射元のピクセルがテカテカした金属のように反射しやすい材質で,そのロケットが視線の反対方向で何かと衝突した場合は,発射元のピクセルに衝突した何かが映り込んでいると判断できるという理屈である。
レイとポリゴンが衝突したら,そのポリゴンの向きや材質などの情報を調べる。たとえば,レイの射出元(≒光源)が,「そのポリゴンの陰影情報が知りたい」という場合,プログラマブルシェーダへそのための処理を発注する。ちなみに,処理を発注されるプログラマブルシェーダとは,通常の描画を担当しているプログラマブルシェーダと同じものだ。GPU側のレイトレーシングユニットと,プログラマブルシェーダを共有していると言ってもいいだろう。
光源が,衝突したポリゴンをレイが素通りして先へと進めたり,衝突したポリゴンから反射方向に向きを変えて進めたりすることも可能だ。さらに,衝突したポリゴンから新たに複数のレイを放つこともできる。
複雑そうなレイトレーシングだが,それを少しでも効率よく処理するために,いくつかの工夫を凝らすのが一般的だ。そのひとつが「Axis Aligned Bounding Box」(軸平行境界ボックス,以下 AABB)というもので,これはシーン内に存在する3Dモデルそれぞれの全体を覆うことが可能な最小体積の直方体を,3D座標軸に平行・垂直な向きに揃えた構造で管理する。AABBは,フィギュアのブリスターパッケージのようなイメージで想像すると分かりやすいだろうか。
そのうえで,AABBの直方体を階層構造にしたような構造体「Bounding Volume Hierarchy」(バウンディングボリューム階層構造,以下 BVH)と呼ばれる構造体に対してレイを放つ仕組みを採用することで,レイの推進(Traverse,トラバース)と衝突判定(インターセクション,Ray-Triangle Intersection)を行いやすくしているのだ(図2)。
レイと直方体の衝突があれば,衝突の探索範囲をひとつ下の階層にある小さな直方体内に切り替え,この処理を繰り返す。そうして最下層の直方体に到達すると,やっと衝突先のポリゴンを突き止められるわけだ。
この仕組みなら,レイと直方体との判定は,複雑な幾何学計算が不要な座標値の大小判定の組み合わせで行えるし,上階層の直方体で衝突しなかったと判定できたなら,これ以上の探索不要と判断して,その直方体のサイズ分だけ,レイを一気に,ワープのように進められる。レイのワープ先になんの直方体もなければ,そこからさらにワープできるわけで,レイトレーシングの処理を大幅に効率化できるのだ。
- この記事のURL: