事前演算済み放射輝度伝播 (Direct3D 9)

事前演算済み放射輝度伝播の使い方

魅力的なシーンには、複雑さを示すいくつかのフォームがあり、これには、ライティング環境をモデリングする方法 (領域ライティング モデルとポイント/方向モデル) や、モデリングするグローバル エフェクトの種類 (シャドウ、相互反射、サブサーフェス スキャッタリング) が含まれます。従来のインタラクティブなレンダリング テクニックを使ったモデリングでは、この複雑さの量を制限します。PRT では、次のような大きな制限があるエフェクトが実現されます。

  • オブジェクトは固定と見なされます (つまり、変形なし)。
  • オブジェクト中心のアプローチです (オブジェクトが一緒に移動しない限り。これらのグローバル エフェクトはオブジェクト間では保持されません)。
  • 低周波のライティングのみがモデリングされます (ソフトなシャドウが生成されます)。低周波ライト (はっきりとしたシャドウ) については、従来のテクニックを採用する必要があります。

RPT では次のどちらか一方が必要です。

  • 細かくテッセレーションされたモデルと vs_1_1
  • ps_2_0

標準ディフューズ ライティングと PRT

次の画像は、従来の (n ? l) ライティング モードを使用してレンダリングされています。くっきりとしたシャドウは、別のパスといくつかのシャドーイング テクニックのフォーム (シャドウ マップの深度やシャドウ ボリューム) を使って有効にできます。複数のライトを追加すると、複数のパス (シェーダーが使用される場合)、または従来のテクニックを使ったより複雑なシェーダーが必要です。

Ee422144.PRT_Diffuse_cropped(ja-jp,VS.85).png

次の画像は、解決できる単一のディレクショナル ライトの最良近似を使う PRT でレンダリングされています。これによって、ソフト シャドウは従来のテクニックで生成するのが難しくなります。PRT は常に複数のライトを追加して、または環境マップを使用してライティング環境を完了するため、シェーダーが使用するコンテンツの値のみ変更することになります (ただし番号は変更しません)。

Ee422144.PRT_DiffuseShadows_cropped(ja-jp,VS.85).png

相互反射による PRT

直接ライティングは、ライトからサーフェスに直接達します。相互反射とは、他のいくつかのサーフェスを何度かバウンスした後にサーフェスに到達するライトです。PRT では、シミュレーターをさまざまなパラメーターで単純に実行することで、パフォーマンスを一度に変更せずにこの動作をモデリングできます。

次の図は、直接的な PRT のみで作成されます (相互反射なしの 0 バウンス)。

Ee422144.PRT_NoInterReflections(ja-jp,VS.85).png

この図は相互反射ありの PRT (相互反射ありの 2 回のバウンス) を使用して作成されます。

Ee422144.PRT_InterReflections(ja-jp,VS.85).png

サブサーフェス スキャッタリングによる PRT

サブサーフェス スキャッタリングとは、ライトが特定のマテリアルを通過する方法をモデリングするテクニックです。たとえば、手のひらに点灯した懐中電灯を押し付けます。懐中電灯の光は、手を通過して、あちこちバウンスし (そのプロセスで色を変えながら)、手の反対側から放出されます。これは、シミュレーターを単純に変更し、ランタイムを変更しないことでモデリングすることもできます。

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

Ee422144.PRT_Subsurface(ja-jp,VS.85).png

PRT の仕組み

以下の図 1 に示すとおり、次の用語は PRT の仕組みの理解に役立ちます。

光源放射輝度:光源放射輝度は、ライティング環境全体を表します。PRT では、任意の環境は球面調和基底を使用して近似されます。つまり、このライティングはオブジェクを基準とした相対距離と見なされます (同じことが環境マップでも想定されます)。

発射放射輝度:発射放射輝度とは、あらゆる可能な光源 (反射された放射輝度、サブサーフェス スキャッタリング、エミッション) からのサーフェス上のポイントを離れるライトです。

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

Ee422144.PRT_LightingPicture(ja-jp,VS.85).png

図 1:PRT の概念図

PRT はレンダリング プロセスを次の 2 つのステージに分解します。

  1. 負荷の大きい光転送シミュレーションでは、ランタイム時に使用できる転送係数が事前に計算されます。
  2. 比較的軽量なランタイム ステージでは、まず球面調和基底を使用してライティング環境を近似し、次のこれらのライティング係数と事前計算された転送係数 (ステージ 1 からの) を単純なシェーダーとともに使用します。これによって発射放射輝度 (オブジェクトを離れる光) が算出されます。

Ee422144.PRT_DataFlow(ja-jp,VS.85).png

図 2:簡略化された PRT データ フロー

PRT API の使い方

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

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

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

    PRT rendering equation

    この場合

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

    ID3DXPRTCompBuffer の Extract... メソッドにより、シミュレーションから圧縮されたデータにアクセスできます。

  2. 光源放射輝度を計算します。

    API には、さまざまな一般的ライティング シナリオを処理するヘルパー関数がいくつもあります。

    関数 目的
    D3DXSHEvalDirectionalLight 従来のディレクショナル ライトの近似値を求めます。
    D3DXSHEvalSphericalLight ローカルの球状光源の近似値を求めます。(PRT は距離ライティング環境のみで動作します)。
    D3DXSHEvalConeLight 遠い領域の光源の近似値を求めます。たとえば太陽などです (極めて狭いコーンの角度)。
    D3DXSHEvalHemisphereLight 2 つのカラー間の線形補間であるライトを評価します (球の各注に 1 つ)。
  3. 発射放射輝度を計算します。

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

     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), テクスチャーによる RPT の表現 (Direct3D 9), ID3DXPRTBuffer, ID3DXPRTCompBuffer, ID3DXPRTEngine, ID3DXTextureGutterHelper, 事前演算済み放射輝度伝播関数, 算術関数