A Reconstruction Filter for Plausible Motion Blur について

テストを兼ねて実装してみました。

[参照]
A Reconstruction Filter for Plausible Motion Blur

ScatterとGatherについて

Blurを適用する際に考えられる方法として、自身のPixelのVelocityに従って、自身のPixelの色を他のPixelに拡散させる方法(Scatter)と、周辺のPixelの色とVelocityに従って、自身のPixelに周辺のPixelを重畳させる方法(Gather)の二つが考えられます。
Scatterの演算は、GPUの処理に置き換えれば、多数のPixelのBlending処理に置き換えられます。メモリの書き込み負荷が高いことが容易に想像がつきます。
一方で、Gatherの演算は、Blurの適用半径を大きくすれば、周辺の多数のPixelをSamplingしなければならず、メモリの読み込み負荷が高いです。また、Gather演算の場合は、SampleしたPixelのVelocityが小さかったり、向きが関係ない方向の場合は、対象PixelにBlurが届かず、Sampling処理自体が無駄になります。

本手法は、Gather手法ですが、周辺のPixelに対して一様にSamplingを行う代わりに、周辺に存在する、一番大きいVelocityを代表として、そのVelocityに基くSamplingを行うことで、Gather手法を用いつつも少ないSampling数で、大きなBlurの適用半径を実現するものです。

Tile Max と Neighbor Maxについて

上記で説明した、周辺に存在する、一番大きいVelocityを検出するために、この2つのバッファを作成します。まず、screen spaceにおけるVelocity Mapが存在するか、算出可能なことが前提です。
Tile Maxは、Blurの最大半径に相当する大きさを単位としてTileを作成し、それぞれのTile内で、Velocityが最大のVectorを保存します。従って、Tile Maxバッファの解像度は、(w,h)/size_of_a_tileとなります。
Neighbor Maxは、自身のTileと隣接する周辺8つのTileの中で、Velocityが最大のVectorを保存します。
後に、Gather演算を行う際に、該当するNeighbor Maxに格納されているVectorを参照すると、”周辺に存在する最も大きなVelocity”を取得することが出来ます。
本手法では、Neighbor Maxに格納されるVectorを”周辺で支配的に作用するVelocity”と見做し、BlurのReconstruction処理を、このベクトルに基いて行います。

Reconstruction処理について

Reconstruction処理では、Neighbor Maxに格納されているVectorに沿って、[-1,1]の範囲で直線上をサンプリングします。(ただし、Ghostingを避けるためにJitteringしています)
SamplingしたPixelと、基準となるPixelのZ値を考慮しつつ、互いにBlurで滲出する量を計算して最終結果としています。(詳細は論文参照のこと。pseudo code付きで解説されています。)

Samplingの際のアクセスパターンは、周辺のTileを共有するPixelで一様なので、Samplerのキャッシュヒットは大いに期待できます。
Blurの半径を大きくすれば、キャッシュのヒット率は低下すると思われますが、Sampleの数を増やせばヒット率が上昇すると思われます。各GPUの特性やそれぞれの状況に応じて調整できると思います。

考察

まず、Tile Max の算出には、Compute Shaderを用いるのが最も適切と思われます。Vectorの長さは常に正なので、uintキャストしてAtomicMaxのパターンです。
一方で、CSの使えない環境下では、PSでMipMapへの畳み込みを行う必要があると思います。
Neighbor Maxも同様の方法で求めることが出来ますが、周辺3×3のSamplingなので、1Threadで3×3ブロックをサンプリングして、比較したほうが速いです。
ここでは、PSを使うかCSを使うか迷うところなので、確かめるために実装してみました。しかし、Neighbor Maxを求めるための同機能のシェーダーコードをPS,CSに実装し、実行時間を比較をGTX680で行ってみましたが、有意な差は見出せませんでした。
したがって、どちらを使っても問題なさそうです。(使用したCSのnumthreadは[4x8x1]です。)

Blur

ちなみにこの論文の手法を元に改良した手法が既に発表されています。
[参照]
A Fast and Stable Feature-Aware Motion Blur Filter