こことここで詳しく説明するリアルタイムの拡散グローバルイルミネーションに、カスケードライトプロパゲーションボリュームアルゴリズム(間接シャドウイングはまだありません)を実装しました。正常に動作しますが、特に1つのアーティファクトを修正しようとしています。
短い要約
アルゴリズムの動作がわかっている場合は、これをスキップできます。
このアルゴリズムは、3Dグリッドに球面調和関数の形式で照明情報を格納することで機能します。最初にグリッドの各セルのデータは、拡張シャドウマップ(反射シャドウマップ)のレンダリングから取得されます。)深度の他に、色と通常の情報も含まれます。本質的には、光源から見たすべてのピクセルが間接照明の最初のバウンスの原因であるため、シャドウマッピングに使用する通常の深度バッファーと一緒に必要な情報を保存し、すべてのデータをサンプリングして3Dグリッドを初期化します。 。3Dグリッドの情報は、1つのセルの情報を6つの直接隣接セルすべて(上、下、左、右、上、下)に(反復ごとに)伝達することにより、反復的に伝達されます。グリッドの情報を使用してシーンを照らすには、シーンに全画面パスを適用し、ラスタライズされたピクセルごとに、ラスタライズされたサーフェスのワールドスペースの位置を使用できるようにします(たとえば、遅延シェーディングのGバッファーから)。画面上の特定のピクセルがグリッドのどのセルに属しているかを知る。
これはほとんどの部分で正常に機能しています。ここでは、GIがシミュレートされていない、ハードコードされた環境項のみの2つの画像と、その隣にLPVアルゴリズムを使用した画像があります。サーフェス上の色付きの反射、深度の詳細などに注意してください。
問題
ライティングステージでセルを検索する場合、ハードウェアテクスチャフィルターを使用したトリリニア補間を使用して、セルの中心、隣接するセル、および実際に検索されたテクスチャ座標の間のデータをスムーズに補間します。基本的に、この補間は、情報が検索される中心の周りのコンクリートピクセルへのセルの中心の照明情報の伝播を模倣します。さもなければ、照明が非常に粗くて醜く見えるため、これは必須です。ただし、トリリニア補間では、セルにエンコードされた照明情報の光の伝播方向が考慮されないため(球面調和関数であることを忘れないでください)、光がルックアップされたピクセルに誤って伝播される可能性があります。たとえば、セルにエンコードされた輝度が(1,0,0)( "
これにより、グリッド内のセルサイズがシーン内のサーフェスと比較して大きい場合、壁から光が不鮮明に漏れます(これは、伝播をできるだけ少なくしてシーンに遠くまで光を伝播するために大きなセルが必要なために必要です)。これは次のようになります。
(右上の影の輪郭から)見てわかるように、シーンは、シーンの左上のどこかにある指向性光源によって照らされています。また、アトリウムの外側と内側を隔てるセルは1つしかないため、光が漏れて左側の壁が誤って照らされます。
実際の質問
著者は、これを修正するために手動の異方性フィルタリングの形式を提案しています。彼は、次のように、表面法線nの方向に向かって放射輝度勾配(現在のセルからサンプリングされたSH係数を想定しています)を与えます。
そして状態
したがって、放射輝度の方向導関数を実際の放射輝度の方向と比較することにより、放射輝度分布がこのポイントのそのトリリニア補間よりもさらに開始するかどうかを計算できます。
私の質問:
方程式では、関数c(x)はポイント(x)でのSH係数のようです。したがって、放射輝度勾配は、点x-(n / 2)およびx +(n / 2)でのSH係数の重み付き差として、通常の数値微分のように計算されるようです。しかし、私のコンテキストではc(x)とは何ですか?現在、私はc(x)がサーフェス位置(x)でトリリニア補間された係数を参照していると仮定していますが、方向についての詳細情報を提供する方法がわからないため、まったくわかりませんSH係数の分布。
そして、その勾配をどのように使用して、セルからサンプリングされたライティングがサーフェスに適用されるかを正確に変更しますか?著者は、「放射輝度の方向導関数を実際の放射輝度の方向と比較する」とだけ書いていますが、これはかなりあいまいです。
彼は「中央差分スキーム」の使用に言及し、SH係数の中央差分についてこれらのスライドを参照し、勾配の導出を示すこの論文も参照していますが、現時点ではそれらから有用な結論を出すことはできません。