void gUpdateSHEnvCoeffs() { D3DXSHScale( gEnvSHRScaled, ENV_SH_ORDER, gEnvSHR, gEnvIntensity ); D3DXSHScale( gEnvSHGScaled, ENV_SH_ORDER, gEnvSHG, gEnvIntensity ); D3DXSHScale( gEnvSHBScaled, ENV_SH_ORDER, gEnvSHB, gEnvIntensity ); float* fLight[3] = { gEnvSHRScaled, gEnvSHGScaled, gEnvSHBScaled }; // Lighting environment coefficients D3DXVECTOR4 vCoefficients[3]; // These constants are described in the article by Peter-Pike Sloan titled // "Efficient Evaluation of Irradiance Environment Maps" in the book // "ShaderX 2 - Shader Programming Tips and Tricks" by Wolfgang F. Engel. static const float s_fSqrtPI = ((float)sqrtf(D3DX_PI)); const float fC0 = 1.0f/(2.0f*s_fSqrtPI); const float fC1 = (float)sqrt(3.0f)/(3.0f*s_fSqrtPI); const float fC2 = (float)sqrt(15.0f)/(8.0f*s_fSqrtPI); const float fC3 = (float)sqrt(5.0f)/(16.0f*s_fSqrtPI); const float fC4 = 0.5f*fC2; int iChannel; for( iChannel=0; iChannel<3; iChannel++ ) { vCoefficients[iChannel].x = -fC1*fLight[iChannel][3]; vCoefficients[iChannel].y = -fC1*fLight[iChannel][1]; vCoefficients[iChannel].z = fC1*fLight[iChannel][2]; vCoefficients[iChannel].w = fC0*fLight[iChannel][0] - fC3*fLight[iChannel][6]; } gEnvSHConstAr = vCoefficients[0]; gEnvSHConstAg = vCoefficients[1]; gEnvSHConstAb = vCoefficients[2]; //ep.addVector4( "cAr", vCoefficients[0] ); //ep.addVector4( "cAg", vCoefficients[1] ); //ep.addVector4( "cAb", vCoefficients[2] ); for( iChannel=0; iChannel<3; iChannel++ ) { vCoefficients[iChannel].x = fC2*fLight[iChannel][4]; vCoefficients[iChannel].y = -fC2*fLight[iChannel][5]; vCoefficients[iChannel].z = 3.0f*fC3*fLight[iChannel][6]; vCoefficients[iChannel].w = -fC2*fLight[iChannel][7]; } gEnvSHConstBr = vCoefficients[0]; gEnvSHConstBg = vCoefficients[1]; gEnvSHConstBb = vCoefficients[2]; //ep.addVector4( "cBr", vCoefficients[0] ); //ep.addVector4( "cBg", vCoefficients[1] ); //ep.addVector4( "cBb", vCoefficients[2] ); vCoefficients[0].x = fC4*fLight[0][8]; vCoefficients[0].y = fC4*fLight[1][8]; vCoefficients[0].z = fC4*fLight[2][8]; vCoefficients[0].w = 1.0f; gEnvSHConstC = vCoefficients[0]; //ep.addVector4( "cC", vCoefficients[0] ); }
//-------------------------------------------------------------------------------------- void UpdateLightingEnvironment() { // Gather lighting options from the HUD g_vLightDirection = g_LightControl.GetLightDirection(); g_fLightIntensity = g_SampleUI.GetSlider( IDC_LIGHT_SLIDER )->GetValue() / 100.0f; g_fEnvIntensity = g_SampleUI.GetSlider( IDC_ENV_SLIDER )->GetValue() / 1000.0f; // Create the spotlight D3DXSHEvalConeLight( D3DXSH_MAXORDER, &g_vLightDirection, D3DX_PI / 8.0f, g_fLightIntensity, g_fLightIntensity, g_fLightIntensity, m_fRLC, m_fGLC, m_fBLC ); float fSkybox[3][D3DXSH_MAXORDER*D3DXSH_MAXORDER]; // Scale the light probe environment contribution based on input options D3DXSHScale( fSkybox[0], D3DXSH_MAXORDER, g_fSkyBoxLightSH[0], g_fEnvIntensity ); D3DXSHScale( fSkybox[1], D3DXSH_MAXORDER, g_fSkyBoxLightSH[1], g_fEnvIntensity ); D3DXSHScale( fSkybox[2], D3DXSH_MAXORDER, g_fSkyBoxLightSH[2], g_fEnvIntensity ); // Combine the environment and the spotlight D3DXSHAdd( m_fRLC, D3DXSH_MAXORDER, m_fRLC, fSkybox[0] ); D3DXSHAdd( m_fGLC, D3DXSH_MAXORDER, m_fGLC, fSkybox[1] ); D3DXSHAdd( m_fBLC, D3DXSH_MAXORDER, m_fBLC, fSkybox[2] ); }