Image Space Gathering

Image Space Gathering
http://www.nvidia.com/docs/IO/78196/HPG09-ISG.pdf

なんとなくわかる気がするので読んでなかったのですが、いい機会なので、なんとなく読んでみました。

1.Introduction

基本的なアイデアとしてあるのは、Disribution Ray TraceでサンプリングするべきRayを、Screen Spaceで取得したRayで代用しようということです。Fig(2)が要約をすべてを語っています。左側が本来Distribution Ray Traceで飛ばすRayで、それを右側のScreen SpaceのRayで代用しようというものです。この論文では、Soft ShadowとDoF、そして、Glossy Reflectionが扱われています。

3.Algorithm

ひとことで言うならば、2ステップのBilateral Filterです。最初のステップをParameter Searchと呼び、2番目のステップをGatherと呼びます。要は、Parameter Searchのステップで、GatherステップのFilter Kernelの”台”(有効半径)を決めるというものです。
Filterの式に関しては、eq(1) ~ eq(4)で示されている通りです。Weighted Averageで、Weightは、Rage関数:r()とWeight関数:w()に分かれていますが、この論文では、w()に関しては論じていません。w()に関してはこの論文内では実質定数として扱われています。逆に、Range関数は、Weight関数として扱われています。

3.1 Soft Shadow

まず前提として、View Depth, BinaryのShadow MapとNearest Blockerまでの距離がスクリーンスペースでレンダリングされていることとします。加えてWorld Spaceの座標も計算可能とします。
また、モデルを単純化するために、Light, Occluder, Receiver は平行に存在しているとします。したがって、半影の大きさは、これらの距離の関係で決まるものとします。

Parameter Search

Parameter Searchでは、シェーディングしている点から、Virtual Area Light(Potential Occluder)までの距離を推定します。
まず、Potential Occluderを探す際の、FilterのSampleの分布形状ですが、これは、そのままVirtual Area Lightの形状に帰結します。Disk形状のSampleを使えば球形の光源を模す事となりますし、Rectangle形状のサンプルを使えば、方形となります。
Parameter Searchのサンプリング半径は、eq(5)で与えられます。LはVirtual Area Lightの大きさの係数になります。Zeyeはシェーディングしている点の、ViewスペースのDepthです。
次に、FilteringのWeightですが、Range関数:r()をeq(6)のようにします。lはShadingしている点と、サンプリングされた点とのWorld空間での距離となります。inShadow()は、Shadowであれば1、Litなら0を返すBinary Functionです。つまり、World空間で距離が近ければ、Weightが大きくなり、サンプルがLitならば、棄却することになります。
これでParameter Searchのステップが完了で、Potential Occluderまでの距離が求まります。

Gathering

Parameter Searchで求まった、Potential Occluderまでの距離を用いて、eq(8)で、Penumbraの半径を計算します。これは単純な三角形の比の計算です。これをeq(9)でScreen SpaceにProjectionして、実際のフィルタ半径とし使用します。
サンプリング形状は、当然Parameter Searchと同様の形状を用います。
最後にFilteringのWeightですが、これもeq(6)と同様のガウス関数を用います。ただし、当然ながら、GatherではisShadow()による棄却は行いません。

3.2 Glossy Reflection

まず前提として、Screen Spaceで、Reflected Colorと、Reflected Objectまでの距離のマップがあるものとします。(シェーディングしてる点で、視線を鏡面反射させたベクトルの先にあるオブジェクトまでの距離とそのRadianceのマップだと思います。)
さらに、Fig(4)の左側のように、Glossy Reflectionでサンプリングされる角度を限定するため、θmaxの外側の領域のBRDFを0として考えます。

ParameterSearch

ParameterSearchでは、シェーディング点における、Reflected Objectとの距離を決めます。
まず、サンプリング半径は、カメラのFovと、Fig(4)にある、θmaxの比から計算します。ウェイト関数は、Soft Shadow同様にガウス関数を用いていますが、係数は、ワールド空間におけるシェーディング点との距離に加え、その法線を考慮するものが使われます。要するに、近くて、Normalが似ているサンプルのWeightが高く評価されます。
これによって、シェーディング点における、Reflected Objectとの距離を計算します。

Gathering

次にGatheringですが、まず、Parameter Searchで計算されたReflected Objectとの距離から、フィルタ半径を計算します。
Fig(4)の右の図の通り、θmaxと同じ半径になるように、カメラからの距離と、Reflected Objectとの距離から計算すると、eq(13) のようになります。これよりGatherで用いるフィルタ半径の角度:αが求まり、これとカメラのFovとの比を求めれば、実際のScreen Spaceのフィルタ半径が求まります。
さらに、カメラとシェーディング点とのGrazing Angleを考慮に入れると、フィルタ半径はeq(14)のようになります。ウエイト関数は、Parameter Searchと同様のものを用います。(法線をどこから入手するかは、論文で言及していない)またこれは、単なる定数や、ガウス関数、もしくはもっと複雑なBRDF関数にするとこができます。

まとめ

Dofは省略しました。特に難しい計算とかはなく、要はBilateral Filterが2ステップ使われているようです。Weight関数や、サンプル形状に関しては、用途に応じて随時いろいろ考えられると思います。
できることは、結局Fig(9)に凝縮されていると思います。
Reflectionや、Shadow Blockerのレンダリングが、現状のラスタライザーではコストが高いので、簡単に使えるというわけではないですが、Fig(9)の上部で示されるようなバッファがレンダリングができれば、下部で示されるようなフィルタリングの結果が得られるということだと思います。

広告