PRT の方程式 (Direct3D 9)
PRT を実装するシェーダーを完全に理解するには、シェーダーが発射放射輝度の計算に使用する方程式を考えるとわかりやすくなります。
まず、任意の距離のライティングでディフューズ オブジェクト上の直接ライティングから得られる発射放射輝度を計算する一般的な方程式を次に挙げます。
この場合
パラメーター | 説明 |
---|---|
Rp | 頂点 p の発射放射輝度。メッシュの頂点ごとに評価されます。 |
pd | サーフェスのアルベド。 |
pi | 省エネ正規化係数として使用される定数。 |
L(s) | ライティング環境 (光源放射輝度) |
Vp(s) | ポイント p のバイナリ可視性関数。ポイントからライトが見える場合は 1、見えない場合は 0 です。 |
Hnp(s) | ランバートの法則からのコサイン用語。最大値と等しく((Np ? s), 0)、この場合 Np はポイント p のサーフェス法線です。 |
s | 球で統合される変数。 |
球面調和などの球面基底関数を使用すると、ライティング環境を概算する方程式は次のようになります。
この場合
パラメーター | 説明 |
---|---|
L(s) | ライティング環境 (光源放射輝度) |
i | 基底関数の数を合計する関数。 |
O | 球面調和の順序。 |
li | 係数。 |
Yi(s) | 球上のいくつかの基底関数。 |
これらの係数の集まりである L' は基底関数 Y(s) による関数 L(s) の最適な近似値を算出します。代入と分配の結果は次のとおりです。
Yi(s)Vp(s)Hnp(s) の整数は、シミュレーターがメッシュ上の頂点ごとに事前計算する転送係数 tpi です。これを代入すると、次の結果が得られます。
これをベクトル表記に変更すると、チャンネルごとの発射放射輝度を計算するための圧縮されていない方程式が生成されます。
この場合
パラメーター | 説明 |
---|---|
Rp | 頂点 p の発射放射輝度。 |
pd | サーフェスのアルベド。 |
L' | li のベクトルであり、球面調和基底関数への光源放射輝度の射影。これは球面調和係数の Order2 ベクトルです。 |
Tp | 頂点 p の order2 転送ベクトル。シミュレーターはこの転送係数を p で除算します。 |
これらのベクトルは両方とも球面調和係数の order2 ベクトルであるため、これは単純な内積です。順序によっては、内積は負荷が大きくなることがあるため、圧縮を使用します。クラスター主成分分析 (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 は頂点ごとに変化するため、サンプルではこれらの頂点ごとのデータが頂点バッファーに格納されます。