次の方法で共有


事前計算された放射転送 (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 ベクトルの数を合計する整数。
    pj ポイント p の j 番目の PCA の重み。 これは 1 つの係数です。
    Bkj クラスター k の jth PCA 基底ベクトル。 これは係数の Order² ベクトルです。

     

    抽出...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

事前計算された放射伝達関数

数学関数の