事前計算済みの放射転送 (Direct3D 9)

事前計算済みの放射転送の使用

興味深いシーンには、照明環境がどのようにモデル化されるか (つまり、エリアライティング モデルとポイント/方向のモデル)、モデル化されるグローバル効果の種類 (シャドウ、相互参照、サブサーフェス散乱など) など、いくつかの複雑さが存在します。従来の対話型レンダリング手法では、この複雑さの量が限られています。 PRT では、いくつかの重要な制限を伴うこれらの効果が有効になります。

  • オブジェクトは、剛体 (つまり変形なし) であると見なされます。
  • これはオブジェクト中心のアプローチです (オブジェクトを一緒に移動しない限り、これらのグローバル効果はそれらの間で維持されません)。
  • 低周波数の照明のみがモデル化されます (結果としてソフト シャドウになります)。高周波ライト (鮮明な影) の場合は、従来の手法を採用する必要があります。

PRT には次のいずれかが必要ですが、両方は必要ありません。

  • 高度にテセレーションされたモデルとvs_1_1
  • ps_2_0

標準拡散照明と PRT

次の図は、従来の (n · l) 照明モデルを使用してレンダリングされます。 シャープ シャドウは、別のパスと何らかの形式のシャドウ手法 (シャドウ深度マップまたはシャドウ ボリューム) を使用して有効にすることができます。 複数のライトを追加するには、複数のパス (シャドウを使用する場合) または従来の手法を使用したより複雑なシェーダーのいずれかが必要になります。

従来の照明モデルを使用してレンダリングされたイラストのスクリーン ショット

次の図は、解決できる単一方向ライトの最適な近似値を使用して PRT でレンダリングされます。 これにより、従来の手法では生成が困難なソフト シャドウが生成されます。 PRT では常に、複数のライトを追加したり、環境マップを使用したりする照明環境が完全にモデル化されるため、シェーダーで使用される定数の値 (ただし、数は変更しません) のみを変更します。

prt を使用してレンダリングされたイラストのスクリーン ショット

PRT と相互参照

直接照明は、ライトから直接サーフェスに到達します。 相互反射は、ある程度の回数、他のサーフェスから跳ね返った後にサーフェスに到達する光です。 PRT では、パラメーターが異なるシミュレーターを実行するだけで、実行時のパフォーマンスを変更することなく、この動作をモデル化できます。

次の図は、直接 PRT のみを使用して作成されます (相互参照なしで 0 バウンス)。

直接 prt のみを使用してレンダリングされたイラストのスクリーン ショット

次の図は、PRT と相互参照を使用して作成されます (2 つのバウンスと相互参照)。

prt と相互参照を使用してレンダリングされたイラストのスクリーン ショット

サブサーフェススキャタリングを使用した PRT

サブサーフェス散乱は、光が特定の材料を通過する方法をモデル化する手法です。 例として、手のひらに照らされた懐中電灯を押します。 懐中電灯の光が手を通り抜け、周りを跳ね返り(プロセスの色を変える)、手の反対側から出ます。 これは、シミュレーターを簡単に変更し、ランタイムに変更を加えずにモデル化することもできます。

次の図は、サブサーフェス スキャッタリングを使用した PRT を示しています。

サブサーフェス スキャッタリングで prt を使用してレンダリングされた図のスクリーン ショット

PRT のしくみ

次の用語は、次の図に示すように、PRT のしくみを理解するのに役立ちます。

ソースの放射: ソースの放射は、照明環境全体を表します。 PRT では、任意の環境は球面調和基準を使用して近似されます。この照明は、オブジェクトに対して離れていると見なされます (環境マップで行われるのと同じ仮定)。

出口放射輝度:出口放射は、可能な任意のソース(反射放射輝度、サブサーフェス散乱、放射)から表面上の点から離れる光です。

転送ベクトル: 転送ベクトルは、ソース放射を出口放射にマップし、複雑な光輸送シミュレーションを使用してオフラインで事前計算されます。

prt のしくみの図

PRT は、次の図に示すように、レンダリング プロセスを 2 つの段階に要素化します。

  1. 高価な光輸送シミュレーションは、実行時に使用できる転送係数を事前計算します。
  2. 比較的軽量なランタイム ステージは、最初に球面調和基準を使用して照明環境を近似し、これらの照明係数と事前計算された転送係数 (ステージ 1 から) を単純なシェーダーで使用し、終了放射 (オブジェクトから出る光) を生成します。

prt データ フローの図

PRT API を使用する方法

  1. Compute... のいずれかを使用して転送ベクトルを計算します。 ID3DXPRTEngine のメソッド。

    これらの転送ベクトルを直接処理するには、大量のメモリとシェーダー計算が必要です。 圧縮により、必要なメモリとシェーダーの計算量が大幅に削減されます。

    最終的な照明値は、次の圧縮レンダリング式を実装する頂点シェーダーで計算されます。

    prt レンダリングの数式

    各値の説明:

    パラメーター 説明
    Rp 頂点 p での出口放射の単一チャネルは、メッシュ上のすべての頂点で評価されます。
    Mk クラスター k の平均。 これは係数の Order² ベクトルです。
    k 頂点 p のクラスター ID。
    L' SH基底関数へのソース放射輝度の近似。 これは係数の Order² ベクトルです。
    j PCA ベクトルの数を合計する整数。
    wpj ポイント p の j 番目の PCA 重み。 これは 1 つの係数です。
    Bkj クラスター k の j 番目の PCA 基底ベクトル。 これは係数の Order² ベクトルです。

     

    The Extract... ID3DXPRTCompBuffer のメソッドを使用すると、シミュレーションから圧縮データにアクセスできます。

  2. ソースの放射を計算します。

    API には、さまざまな一般的な照明シナリオを処理するためのヘルパー関数がいくつかあります。

    機能 目的
    D3DXSHEvalDirectionalLight 従来のディレクショナル ライトを近似します。
    D3DXSHEvalSphericalLight ローカル球面光源を近似します。 (PRT は距離照明環境でのみ機能します。
    D3DXSHEvalConeLight 遠くの領域の光源を近似します。 たとえば、太陽 (非常に小さな円錐角度) があります。
    D3DXSHEvalHemisphereLight 2 つの色 (球の各極に 1 つずつ) 間の線形補間であるライトを評価します。

     

  3. 終了放射を計算します。

    数式 1 は、頂点シェーダーまたはピクセル シェーダーを使用して、すべてのポイントで評価する必要があります。 シェーダーを評価する前に、定数を事前計算して定数テーブルに読み込む必要があります (詳細については、 PRT デモ サンプル を参照してください)。 シェーダー自体は、この式の簡単な実装です。

    struct VS_OUTPUT
    {
        float4 Position   : POSITION;   // vertex position 
        float2 TextureUV  : TEXCOORD0;  // vertex texture coordinates 
        float4 Diffuse    : COLOR0;     // vertex diffuse color
    };
    
    VS_OUTPUT Output;   
    Output.Position = mul(vPos, mWorldViewProjection);
    
    float4 vExitR = float4(0,0,0,0);
    float4 vExitG = float4(0,0,0,0);
    float4 vExitB = float4(0,0,0,0);
    
    for (int i=0; i < (NUM_PCA_VECTORS/4); i++) 
    {
       vExitR += vPCAWeights[i] * 
           vClusteredPCA[iClusterOffset+i+1+(NUM_PCA_VECTORS/4)*0];
       vExitG += vPCAWeights[i] * 
           vClusteredPCA[iClusterOffset+i+1+(NUM_PCA_VECTORS/4)*1];
       vExitB += vPCAWeights[i] * 
           vClusteredPCA[iClusterOffset+i+1+(NUM_PCA_VECTORS/4)*2];
    }
    
    float4 vExitRadiance = vClusteredPCA[iClusterOffset];
    vExitRadiance.r += dot(vExitR,1);
    vExitRadiance.g += dot(vExitG,1);
    vExitRadiance.b += dot(vExitB,1);
    
    Output.Diffuse = vExitRadiance;
    

リファレンス

PRT および球面高調波の詳細については、次の論文を参照してください。

Precomputed Radiance Transfer for Real-Time Rendering in Dynamic, 
Low-Frequency Lighting Environments 
P.-P. Sloan, J. Kautz, J. Snyder
SIGGRAPH 2002 

Clustered Principal Components for Precomputed Radiance Transfer 
P.-P. Sloan, J. Hall, J. Hart, J. Snyder 
SIGGRAPH 2003 

Efficient Evaluation of Irradiance Environment Maps 
P.-P. Sloan 
ShaderX 2,  W. Engel 

Spherical Harmonic Lighting: The Gritty Details 
R. Green 
GDC 2003 

An Efficient Representation for Irradiance Environment Maps 
R. Ramamoorthi, P. Hanrahan 

A Practical Model for Subsurface Light Transport 
H. W. Jensen, S. R. Marschner, M. Levoy, and P. Hanrahan 
SIGGRAPH 2001 

Bi-Scale Radiance Transfer 
P.-P. Sloan, X. Liu, H.-Y. Shum, J. Snyder
SIGGRAPH 2003 

Fast, Arbitrary BRDF Shading for Low-Frequency Lighting Using Spherical 
Harmonics 
J. Kautz, P.-P. Sloan, J. Snyder
12th Eurographics Workshop on Rendering 

Precomputing Interactive Dynamic Deformable Scenes 
D. James, K. Fatahalian 
SIGGRAPH 2003 

All-Frequency Shadows Using Non-linear Wavelet Lighting Approximation 
R. Ng, R. Ramamoorth, P. Hanrahan 
SIGGRAPH 2003 

Matrix Radiance Transfer 
J. Lehtinen, J. Kautz
SIGGRAPH 2003 

Math World 
E. W. Weisstein, Wolfram Research, Inc. 

Quantum Theory of Angular Momentum 
D. A. Varshalovich, A.N. Moskalev, V.K. Khersonskii 

高度なトピック

PRT 数式 (Direct3D 9)

テクスチャを使用した PRT の表現 (Direct3D 9)

ID3DXPRTBuffer

ID3DXPRTCompBuffer

ID3DXPRTEngine

ID3DXTextureGutterHelper

事前計算済みの放射転送関数

数値演算関数