Поделиться через


Метод ID3DXPRTEngine::ComputeBounce

Вычисляет исходное сияние, полученное в результате одного отскакиваемого света. Этот метод можно использовать для любой освещенной сцены, включая модель предварительно вычисляемой передачи сияния (PRT) на основе сферической гармоники (SH).

Синтаксис

HRESULT ComputeBounce(
  [in]      LPD3DXPRTBUFFER pDataIn,
  [in, out] LPD3DXPRTBUFFER pDataOut,
  [in, out] LPD3DXPRTBUFFER pDataTotal
);

Параметры

pDataIn [in]

Тип: LPD3DXPRTBUFFER

Указатель на входной объект ID3DXPRTBuffer , представляющий трехмерный объект из предыдущего отказа света. В этом входном буфере должно быть правильное количество цветовых каналов, выделенных для имитации.

pDataOut [in, out]

Тип: LPD3DXPRTBUFFER

Указатель на выходной объект ID3DXPRTBuffer , который моделирует один отказ от переотражаемого света. В этом выходном буфере должно быть правильное количество цветовых каналов, выделенных для имитации.

pDataTotal [вход, выход]

Тип: LPD3DXPRTBUFFER

Указатель на необязательный объект ID3DXPRTBuffer , который является суммой выполнения всех предыдущих выходных данных pDataOut. Может иметь значение NULL.

Возвращаемое значение

Тип: HRESULT

Если метод выполнен успешно, возвращаемое значение будет 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 );

Выходные данные этого метода не включают альбедо, и в симулятор интегрирован только входящий свет. Не умножая альбедо, можно смоделировать вариант альбедо в более тонком масштабе, чем исходное сияние, тем самым обеспечивая более точные результаты от сжатия.

Вызовите ID3DXPRTEngine::MultiplyAlbedo , чтобы умножить каждый вектор PRT на альбедо.

Требования

Требование Значение
Заголовок
D3DX9Mesh.h
Библиотека
D3dx9.lib

См. также раздел

ID3DXPRTEngine

ID3DXPRTEngine::ComputeSS