"Multiresolution Splatting for Indirect Illumination"の概要

論文"Multiresolution Splatting for Indirect Illumination"を読みましたので, 概要を書きます.

  • "Multiresolution Splatting for Indirect Illumination". Greg Nichols, Chris Wyman. In Symposium on Interactive 3D Graphics and Games, pp.83-90, 2009.

一言で言うと, "Splatting Indirect Illumination" を改良して, 間接光が与える影響の範囲を表した AABB(Axis-Aligned Bounding-Box)の形状の薄い平板 "splat" を複数の解像度を持つバッファ(illumination buffer)に対して描画することによって, フィルレートを下げる方法です.

間接光は緩やかに値が変化する低周波数の特徴を持っていますので, 近接するピクセルの間接光の値が近い値になりやすいです. そこで, 間接光が与える影響の範囲を表したAABB(Axis-Aligned Bounding-Box)の形状の薄い平板 "splat" を描画する際に, 深度や法線の不連続性をチェックすることによって, 複数の解像度を持つ illumination buffer (解像度は32x32, 64x64, 128x128, 256x256等) のうち, どの解像度のバッファで間接光の照明計算を行うか決定します. 不連続性チェックによって連続な領域と判定されたところは低い解像度のバッファに計算結果を代入し, 不連続な領域と判定されたところはより解像度が高いバッファに対して計算結果を代入するようにします.

深度や法線の不連続性であることの判定は, 深度や法線の各成分の最小値・最大値を保存したmin-max ミップマップというものを作成し, 最小値と最大値の差が閾値以上のときに行います.

また splat のレンダリング時には, vertex shader が どの解像度の illumination buffer に書き込むかを決定し, fragment shader で間接光の計算を行います.

最後に, 複数の解像度を持つ illumination buffer の結果を組み合わせるのですが, このときに ringing や haloing を防ぐために, 同じ解像度のバッファだけで照明計算の結果の線形補間を行い, 解像度の粗いバッファから順に既に照明の計算結果が入っているところの結果だけを使うようにします.