事前計算された放射転送 (Direct3D 9)

事前計算された放射転送の使用

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

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

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

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

標準拡散照明と PRT

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

screen shot of an illustration rendered by using the traditional lighting model

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

screen shot of an illustration rendered by using prt

PRT と Interreflections

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

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

screen shot of an illustration rendered by using direct prt only

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

screen shot of an illustration rendered by using prt with interreflections

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

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

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

screen shot of an illustration rendered by using prt with subsurface scattering

PRT のしくみ

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

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

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

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

diagram of how prt works

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

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

diagram of prt data flow

PRT API を使用する方法

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

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

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

    equation of prt rendering

    各値の説明:

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

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

数値演算関数