水鳥コンビナート

CGとかUnityとか

A Multiview and Multilayer Approach for Interactive Ray Tracing

AUEB Computer Graphics Group - Publications

www.youtube.com

I3D 2016 の論文。

複数ビューの組み合わせとフラグメントの重なりを表現するデータ構造の実装により、 スクリーンスペースのエフェクトを実装する際に問題となる 『視界の中の物体しか反映されない』問題を解決する方法を示している。

リアルタイムレンダリングにおいてレイトレーシングっぽいことをやる際の手法のひとつとして、 スクリーンスペースのエフェクトとしてそれを実装する方法がある。 これは一度シーン情報をテクスチャ (G-Buffer) にレンダリングし、 そのテクスチャ情報を使ってレイトレーシングを行うものである。 シーンの複雑さに依存せず GPU との親和性も高いので商用ゲームでも大概用いられているものだが、 画面内に映る情報のみで計算を行うため 逆に言うと見えていない物体を無視してしまうという問題がある。 例えば、 スクリーンスペースリフレクションなら カメラの背後の物体や壁の向こう側にある物体を反射させることができない。 そこでこの論文は 上の方法の G-Buffer 描画の部分を置き換え、 カメラからみて全方位について重なった面全てを記録することで、以上の問題を解決しようとしている。 (ちなみに重なりを記録するようなのは A-Buffer って言うららしい)

詳しい方法についてだが、 まず全方位のレンダリングとしては特に変わったものではなく 各軸各方向にカメラを向けてレンダリングしてキューブマップを作成している。 スクリーンスペースのレイトレするときはそれをオラッッっとくっつけて頑張る感じになる。 FOV とか解像度とかの問題でカメラの正面はキューブマップとは別に描画しているので、 全部で 7 回描画することになる。めっちゃ重そう。

次にピクセル上に重なったフラグメント全てを記録する方法だが、 これには双方向リストが使われている。 リストの実装としては、 テクスチャ上にはリストの先頭と末尾のノード ID のみが書き込まれ、 リスト要素のノードはテクスチャとは別のバッファに書き込まれるようになっている。 ポイントとなるのが、 あるピクセルについてのリストは B 個存在しており、 ピクセル中のフラグメントの最小/最大 Z 値を  z_{min},  z_{max} としたとき、 k 個目  (0 \leq k \lt B) のリストは  k(z_{max}-z_{min})/B + z_{min} \leq z \lt (k+1)(z_{max}-z_{min})/B + z_{min} の範囲のフラグメントをそれぞれ格納するということである。 これによって、レイトレーシングを行う際にはまずざっくりと離散化したブロックで判定を行ってから正確なフラグメントでの判定を行うという枝刈りが可能になる。 しかしデータ構造構築時にフラグメントの Z 値でのソートとかを行う必要があったりしてやっぱりめっちゃ重そう。

正直結構脳筋っぽい手法な気がするが嫌いではない。