void SetupLightingDX9(void) { // 取得Direct3D 9裝置 LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); device->SetRenderState(D3DRS_LIGHTING, TRUE); // 設定環境光 device->SetRenderState(D3DRS_AMBIENT, ConvertToD3DCOLOR(g_vAmbientLight)); // 設定光源 device->LightEnable(0, TRUE); D3DLIGHT9 light; ZeroMemory( &light, sizeof(light) ); light.Type = D3DLIGHT_POINT; light.Position = *(D3DVECTOR *) &g_Light.m_Position; light.Diffuse = *(D3DCOLORVALUE*) &g_Light.m_Diffuse; light.Specular = *(D3DCOLORVALUE*) &g_Light.m_Specular; light.Range = 100.0f; light.Attenuation0 = 1.0f; light.Attenuation1 = 0.0f; light.Attenuation2 = 0.0f; device->SetLight(0, &light); }
void SetupLightingDX9(void) { // `取得Direct3D9裝置` LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); // `開啟打光功能` device->SetRenderState(D3DRS_LIGHTING, TRUE); // `開啟/關閉localviewer功能` device->SetRenderState(D3DRS_LOCALVIEWER, g_bLocalViewer ? TRUE:FALSE); // `開啟/關閉autonormalize功能` device->SetRenderState(D3DRS_NORMALIZENORMALS, g_bAutoNormalize ? TRUE:FALSE); // `設定環境光` device->SetRenderState(D3DRS_AMBIENT, ConvertToD3DCOLOR(g_vGlobal_AmbientLight)); // `指定反光能力的資料來源, 把它設為經由SetMaterial函式中來設定.` device->SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL); device->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL); device->SetRenderState(D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL); device->SetRenderState(D3DRS_SPECULARENABLE, g_bSpecularReflection ? TRUE:FALSE); // `設定物件材質的反光能力` D3DMATERIAL9 mtrl; ZeroMemory( &mtrl, sizeof(mtrl) ); mtrl.Ambient = *(D3DCOLORVALUE*) &g_vMaterialAmbient; mtrl.Diffuse = *(D3DCOLORVALUE*) &g_vMaterialDiffuse; mtrl.Specular = *(D3DCOLORVALUE*) &g_vMaterialSpecular; mtrl.Emissive = *(D3DCOLORVALUE*) &g_vMaterialEmissive; mtrl.Power = g_fMaterialShininess; // `經由呼叫SetMaterial來設定材質` device->SetMaterial(&mtrl); // `設定光源` for ( int i=0; i<g_iNumLights; i++ ) { if ( g_Lights[i].m_bEnabled ) { // `打開這盞光` device->LightEnable(i, TRUE); // `D3D9經由設定D3DLIGHT9 struct來設定光源屬性` D3DLIGHT9 light; ZeroMemory( &light, sizeof(light) ); switch(g_Lights[i].m_eType) { case LIGHT_DIRECTIONAL: // `設定成方向光` light.Type = D3DLIGHT_DIRECTIONAL; light.Direction = *(D3DVECTOR *) &g_Lights[i].m_vDirection; break; case LIGHT_POINT: // `設定成點光源` light.Type = D3DLIGHT_POINT; // `設定位置` light.Position = *(D3DVECTOR *) &g_Lights[i].m_vPosition; // `隨距離的衰減值` // 1/(CONSTANT+LINEAR*d+QUADRATIC*d^2) // `公式中的CONSTANT, LINEAR, QUADRATIC值` light.Attenuation0 = g_Lights[i].m_vAttenuation[0]; light.Attenuation1 = g_Lights[i].m_vAttenuation[1]; light.Attenuation2 = g_Lights[i].m_vAttenuation[2]; break; case LIGHT_SPOT: // `設定成聚光燈` light.Type = D3DLIGHT_SPOT; // `設定位置` light.Position = *(D3DVECTOR *) &g_Lights[i].m_vPosition; // `設定方向` light.Direction = *(D3DVECTOR *) &g_Lights[i].m_vDirection; // `隨距離的衰減值` // 1/(CONSTANT+LINEAR*d+QUADRATIC*d^2) // `公式中的CONSTANT, LINEAR, QUADRATIC值` light.Attenuation0 = g_Lights[i].m_vAttenuation[0]; light.Attenuation1 = g_Lights[i].m_vAttenuation[1]; light.Attenuation2 = g_Lights[i].m_vAttenuation[2]; // `光柱圓錐的一半角度` light.Phi = FastMath::DegreeToRadian(g_Lights[i].m_fSpotlightCutoff); // `Inner Cone的角度, Inner Cone內部沒有角度衰滅.` light.Theta = FastMath::DegreeToRadian(g_Lights[i].m_fSpotLightInnerCone); // `光柱的角度衰滅值` light.Falloff = g_Lights[i].m_fSpotlightExponent; break; } // `光源的Ambient值` light.Ambient = *(D3DCOLORVALUE*) &g_Lights[i].m_vAmbientColor; // `光源的Diffuse值` light.Diffuse = *(D3DCOLORVALUE*) &g_Lights[i].m_vDiffuseColor; // `光源的Specular值` light.Specular = *(D3DCOLORVALUE*) &g_Lights[i].m_vSpecularColor; // `光源有效范圍, 在此把它設定成浮點數所容計的最大值.` light.Range = 1000.0f; // `用SetLight來設定光源屬性` device->SetLight(i, &light); } else { // `關閉這盞光` device->LightEnable(i, FALSE); } } }