ID3DXPRTEngine::ComputeBounce
相互反射したライトの 1 回のバウンスによる光源放射輝度を計算します。このメソッドは、球面調和 (SH) ベースの事前演算済み放射輝度伝播 (PRT) モデルを含んだ、任意のライティング シーンに使用することができます。
HRESULT
ComputeBounce(
LPD3DXPRTBUFFER pDataIn,
LPD3DXPRTBUFFER pDataOut,
LPD3DXPRTBUFFER pDataTotal
);
パラメータ
- pDataIn
直前のライトのバウンスからの 3D オブジェクトを表す、入力の ID3DXPRTBuffer オブジェクトへのポインターです。この入力バッファーは、シミュレーション用に割り当てられた適切な数のカラー チャンネルを持つことが必要です。 - pDataOut
相互反射したライトの 1 回のバウンスをモデリングする、出力の ID3DXPRTBuffer オブジェクトへのポインターです。この出力バッファーは、シミュレーション用に割り当てられた適切な数のカラー チャンネルを持つことが必要です。 - pDataTotal
これまでのすべての pDataOut 出力の累積和である、オプションの ID3DXPRTBuffer オブジェクトへのポインターです。NULL でもかまいません。
戻り値
メソッドが成功した場合は、D3D_OK を返します。失敗した場合は、次の戻り値のいずれかを返します。D3DERR_INVALIDCALL、E_OUTOFMEMORY
解説
直接ライティングでの複数のライトのバウンスをモデリングするには、次の呼び出しシーケンスを使用します。
LPD3DXPRTBUFFER pDataA, pDataB, pDataC; // initialization ID3DXPRTEngine* m_pPRTEngine; ComputeDirectLightingSH( SHOrder, pDataA ); // The accumulation buffer, pDataC, needs to be // initialized to the direct lighting result. pDataC->AddBuffer( pDataA ); hr = m_pPRTEngine->ComputeBounce( pDataA, pDataB, pDataC ); // first bounce hr = m_pPRTEngine->ComputeBounce( pDataB, pDataA, pDataC ); // second bounce hr = m_pPRTEngine->ComputeBounce( pDataA, pDataB, pDataC ); // third bounce hr = m_pPRTEngine->ComputeBounce( pDataB, pDataA, pDataC ); // fourth bounce
サブサーフェス スキャッタリングでの複数のライトのバウンスをモデリングするには、次の呼び出しシーケンスを使用します。
LPD3DXPRTBUFFER pDataA, pDataB, pDataC; // initialization ID3DXPRTEngine* m_pPRTEngine; ComputeDirectLightingSH( SHOrder, pDataA ); // *pDataC should be set to zero. The ComputeSS call will add together // the direct lighting results from pDataA for non-subsurface scattering // elements and subsurface scattering results for the subsurface scattering // elements. Perform proper error handling for each call. hr = m_pPRTEngine->ComputeSS ( pDataA, pDataB, pDataC ); hr = m_pPRTEngine->ComputeBounce( pDataB, pDataA, NULL ); // first bounce hr = m_pPRTEngine->ComputeSS ( pDataA, pDataB, pDataC ); hr = m_pPRTEngine->ComputeBounce( pDataB, pDataA, NULL ); // second bounce hr = m_pPRTEngine->ComputeSS ( pDataA, pDataB, pDataC );
このメソッドの出力はアルベドを含んでおらず、入射するライトのみがシミュレーターに組み込まれます。アルベドを乗算しない場合、アルベドの変動を光源放射輝度よりも微細なスケールでモデリングすることができ、それによって、圧縮の結果がより正確になります。
各 PRT ベクトルをアルベドで乗算するには、ID3DXPRTEngine::MultiplyAlbedo を呼び出します。
要件
ヘッダー: D3DX9Mesh.h 宣言
ライブラリ: D3dx9.lib 内容