Memo of GPU ray tracing using BrickMaps by Matt Swoboda (In Japanese:BrickMap による GPU レイトレーシング)
概要
要約
- 上のデモ動画では GPU でリアルタイムにセカンダリレイ(AO/リフレクション/屈折)を必要とする計算を多用しています.
- そのために GPU でシーンをボクセル化したり, レイと三角形の交差判定を行っています.
- 方法についてはこのデモの目的の都合上, 後述するBrick Map を使ってGPU による三角形のレイトレーシングを実現しています.
- 上の参考文献で挙げた記事についてで "real time ray tracing" 記事1 では GPU でのレイトレーシングの試行錯誤の過程が載っており, "real time ray tracing" 記事2 では今回の実装に辿り着いた詳細な理由について説明がされています.
今回のデモの GPU によるリアルタイムレイトレーシングの目的
- GPU でリアルタイムにセカンダリレイによる シャドウ/AO/リフレクション/屈折 を計算したい. (プライマリレイについては GPU のラスタライズで計算する).
- シーン中の三角形の数は 50,000 〜 100,000 個ぐらい.
- 従って, 巨大なシーンや大量の三角形に対処する効率的なデータ構造である必要はない.
- むしろ, レイトレースのためのデータ構造のトラバース時間は短い方がいい.
- 研究で AABB による BVH, KD-Tree, SVOGI などが使われるが, トラバース時間がかかるので今回の目的には合わない.
- シーンの三角形はかなり動的に変化し続けるので, データ構造の構築時間は短い方がいい.
今回のデモで使った BrickMap について
- BrickMap は 2 レベルの階層構造を持ち, 部分的に疎なデータ構造です.
- 具体的には下図のようにシーンを覆う 3d テクスチャのボクセルグリッド(解像度:64x64x64)がまずあって, そのボクセルが疎でない場合にはその中にBrick(解像度:4x4x4)があります.
- さらに, 各 Brick にはそれと交差する三角形のリンクリストが保存されています.
構築手順
- 1. ジオメトリを低解像度のボクセルグリッド(64x64x64)に対してレンダリングして, 三角形が入ったボクセルをマークしておきます.
- 2. 1. でマークされたボクセル用に Brick(4x4x4)をアロケートします. ボクセルには Brick へのインデックスを書き込んでおきます.
- 3. あたかも高解像度のボクセル(256x256x256, 64 * 4 = 256)かのようにジオメトリをボクセルに対してレンダリングします. 三角形が所属するボクセルが決まったら, そのボクセル内のどの BrickMap に属するか ? を求めて, 最終的に Brick Map の三角形のリンクリストに登録します.
長所
- GPU でのレイマーチが速いです. 一連の処理の流れは以下のようなものになっています.
- 1.まずは低解像度のボクセルグリッドをレイマーチします.
- 2. ヒットしたボクセルグリッド内の BrickMap をレイマーチします.
- 3. ヒットした BrickMap 内の三角形のリストを走査して レイとヒットする三角形を探す.
- レイトレースのためのデータ構造(Brick Map)の構築が速いです.
短所
- シーンの三角形が複雑なときはボクセルに含まれる三角形の数が増えてしまいます. これを防ぐためにはボクセルの解像度を上げる必要があるのですが, そうするとレイマーチが遅くなり,また使用するメモリサイズも増えてしまいます.
BrickMap についての補足情報
- 実は上図のように今回の BrickMap と似たような疎なボクセルデータに関する情報は"SIGGRAPH 2011 Production Volume Rendering" の"この資料"に載っています.
- ここでは疎なボクセルバッファと呼ばれていて, 疎でないセルの中には Block が入っています.