Light Propagation Volumes (LPV) の radiance directional derivative によるLight Leak対策

Light Propagation Volumes in CryEngine 3 [1] で Radiance Volumeからのサンプリング時Leakを抑える手法として

6.3 Anisotropic upsampling of radiance volume

で言及されている direction-dependent upsampling of the resulting radiance volume がよくわからなかったので調べた結果です.
コードとしてはGI-LPV[2]のリポジトリの indirect_light.fp [3]で実際に記述されていたのが参考になりました.

https://advances.realtimerendering.com/s2009/Light_Propagation_Volumes.pdf


SH VolumeのSH係数を補間する際に裏側から漏れ出ていそうな成分をキャンセルするためのもの.
SH Volume からシェーディング点のSH係数をサンプリングした後, シェーディング法線方向に沿ったSH係数の方向微分も計算します.
(実際に前後の点でサンプリングしています)

 
 \nabla_{\mathbf{n}} \mathbf{c}(\mathbf{x})
 =
 \frac{
 \mathbf{c}\!\left(\mathbf{x} + \frac{\mathbf{n}}{2}\right)
 -
 \mathbf{c}\!\left(\mathbf{x} - \frac{\mathbf{n}}{2}\right)
 }{
 \lVert \mathbf{n} \rVert
 }


SH係数の方向微分のベクトルとシェーディング点のSH係数の内積を類似度をみなして,

  1. 類似度が高い
  2. 裏側→表側へのSH変化量がそのままシェーディング点のSHに影響している
  3. 裏側のSHが漏れ出ている疑惑が強い

ということで, その場合はシェーディング点のSHによる寄与を減らす(dampening) しています.

この手法はあくまでleakしていそうだったら減衰させているだけで, より良いSHのサンプリングをするというものではなさそうです.
この前段階で法線バイアス等で十分Leakを避けるためのサンプリング点補正をしたうえでの, 最終調整という位置づけが良いのかもしれないです.

LPV

[1] https://advances.realtimerendering.com/s2009/Light_Propagation_Volumes.pdf
[2] GitHub - innovation-cat/GI-LPV: Implement global illumination with OCaml, using light propagation volumes . · GitHub
[3] GI-LPV/shader/indirect_light.fp at master · innovation-cat/GI-LPV · GitHub