PRT 数式 (Direct3D 9)

PRT を実装するシェーダーを完全に理解するには、シェーダーが終了放射を計算するために使用する数式を派生すると便利です。

開始するには、次の数式は、任意の遠くの照明を持つ拡散オブジェクト上の直接照明から得られる終了放射輝度を計算する一般的な式です。

任意の遠方の照明を持つ拡散オブジェクト上の直接照明に起因する終了放射の方程式

ここで、

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

 

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

照明環境の数式

ここで、

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

 

これらの係数 L' のコレクションは、基底関数 Y を持つ関数 L の最適な近似値を提供します。 置換と分散を行うと、次の式が生成されます。

l(s) を代入し、分散した後の終了放射の方程式

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

転送係数を代入した後の終了放射の方程式

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

ベクトル表記に変更した後の終了放射の方程式

ここで、

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

 

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

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

近似転送ベクトルの数式

ここで、

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

 

クラスターは、同じ平均ベクトルを共有する頂点の数だけです。 次に、クラスター平均、PCA 重み、PCA 基底ベクトル、および頂点のクラスター ID を取得する方法について説明します。

これら 2 つの数式を置き換えることで、次の結果が得られます。

転送ベクトルを置換した後の終了放射の方程式

次にドット積を分布すると、次の式が得られます。

点積を分配した後の終了放射の方程式

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

事前計算済みの放射転送