PRT 数式 (Direct3D 9)

PRT を実装するシェーダーを完全に理解するには、シェーダーが終了放射を計算するために使用する数式を派生させるのが役立ちます。

まず、次の式は、任意の遠くの照明を持つ拡散オブジェクト上の直接照明から得られる出口放射輝度を計算する一般的な方程式です。

equation of the exit radiance resulting from direct lighting on a diffuse object with arbitrary distant lighting

ここで、

パラメーター 説明
Rp 頂点 p での終了放射輝度。 メッシュ上のすべての頂点で評価されます。
pd サーフェスのアルベド。
pi 省エネ正規化係数として使用される定数。
L(s) 照明環境 (ソース放射)。
Vp₍s₎ ポイント p のバイナリ可視性関数。 点が光を見ることができる場合は 1、見えない場合は 0 です。
Hnp₍s₎ ランバートの法則からのコサイン用語。 max((Np· s)、0 と等しい場合、Np はポイント p のサーフェス法線です。
s 球の上に統合される変数。

 

球面高調波などの球面基底関数を用いて、次の式は照明環境を近似する。

equation of the lighting environment

ここで、

パラメーター 説明
L(s) 照明環境 (ソース放射)。
i 基底関数の数を合計する整数。
O 球面高調波の順序。
li 係数。
Yi 球面上の何らかの基礎関数。

 

これらの係数 L' のコレクションは、基底関数 Y を持つ関数 L の最適な近似値を提供します。 置換および分配すると、次の式が得られます。

equation of the exit radiance after substituting l(s) and distributing

Yi(s)Vp₍s₎Hnp₍s₎ の積分は、シミュレーターがメッシュ上のすべての頂点に対して事前計算する転送係数 tpi です。 これを代入すると、次の式が生成されます。

equation of the exit radiance after substituting the transfer coefficient

これをベクトル表記に変更すると、次の非圧縮方程式が生成され、各チャネルの終了放射輝度が計算されます。

equation of the exit radiance after changing to vector notation

ここで、

パラメーター 説明
Rp 頂点 p での終了放射輝度。
pd サーフェスのアルベド。
L' liのベクトルとは、球面高調波基底関数へのソース放射輝度の投影である。 これは球面調和係数の order² ベクトルです。
Tp 頂点 p の order² 転送ベクトル。 シミュレーターは、転送係数を p で除算します。

 

これらのベクトルはどちらも球面調和係数の order² ベクトルであるため、これは単にドット積であることに注意してください。 順序によっては、ドットが高価になる可能性があるため、圧縮を使用できます。 クラスター化主成分分析 (CPCA) と呼ばれるアルゴリズムは、データを効率的に圧縮します。 これにより、より高次の球面高調波近似を使用できるため、シャドウがシャープになります。

CPCA は、転送ベクトルを近似する次の式を提供します。

equation of the approximated transfer vector

ここで、

パラメーター 説明
Tp 頂点 p の転送ベクトル。
Mk クラスター k の平均。
j PCA ベクトルの数を合計する整数。
N PCA ベクトルの数。
wpj ポイント p の j 番目の PCA の重み。
Bkj クラスター k の jth PCA 基底ベクトル。

 

クラスターは、同じ平均ベクトルを共有する頂点の数にすぎません。 クラスター平均、PCA 重み、PCA 基底ベクトル、頂点のクラスター ID を取得する方法については、以下で説明します。

これらの 2 つの数式を代入すると、次の結果が得られます。

equation of the exit radiance after substituting the transfer vector

次いでドット積を分配すると、次の式が得られます。

equation of the exit radiance after distributing the dot product

両方 (Mk·L') と (Bkj·L') は頂点ごとに定数であり、サンプルは CPU でこれらの値を計算し、それらを定数として頂点シェーダーに渡します。wpj は頂点ごとに変化するため、サンプルではこの頂点ごとのデータが頂点バッファーに格納されます。

事前計算された放射輝度転送