Atten = 1/( Attenuation0+ Attenuation1* d + Attenuation2* d2)
聚光燈比點光源多了方向,還多了內光圈和外光圈了的角度。因此,初始化燈光的結構時,就需要設置它們才能讓聚光燈有效裏顯示出來。程序初始化如下:
//
//初始化燈光。
//蔡軍生 2006/09/03
//
void CCAISpotLight::InitLight(void)
{
//
ZeroMemory( &m_meshMaterialFloor, sizeof(D3DMATERIAL9) );
m_meshMaterialFloor.Diffuse.r = 1.0f;
m_meshMaterialFloor.Diffuse.g = 1.0f;
m_meshMaterialFloor.Diffuse.b = 1.0f;
m_meshMaterialFloor.Diffuse.a = 1.0f;
m_meshMaterialFloor.Ambient.r = 1.0f;
m_meshMaterialFloor.Ambient.g = 1.0f;
m_meshMaterialFloor.Ambient.b = 1.0f;
m_meshMaterialFloor.Ambient.a = 1.0f;
m_pd3dDevice->SetMaterial( &m_meshMaterialFloor );
//聚光燈
ZeroMemory( &m_ligthSpot, sizeof(D3DLIGHT9) );
m_ligthSpot.Diffuse.r = 1.0f;
m_ligthSpot.Diffuse.g = 1.0f;
m_ligthSpot.Diffuse.b = 1.0f;
m_ligthSpot.Diffuse.a = 1.0f;
m_ligthSpot.Type = D3DLIGHT_SPOT;
m_ligthSpot.Position = D3DXVECTOR3( 0.0f, 2.0f, 0.0f );
//
m_ligthSpot.Direction = D3DXVECTOR3( 0, -1.0, 0 );
m_ligthSpot.Attenuation0 = 0.0f;
m_ligthSpot.Attenuation1 = 0.1f;
m_ligthSpot.Attenuation2 = 0.0f;
m_ligthSpot.Range = 30.0f;
//
m_ligthSpot.Theta = D3DX_PI/10;
m_ligthSpot.Phi = D3DX_PI/4;
m_ligthSpot.Falloff = 3.0;
m_pd3dDevice->SetLight( 0, &m_ligthSpot );
//
ZeroMemory( &m_meshMaterialSpot, sizeof(D3DMATERIAL9) );
m_meshMaterialSpot.Emissive.r = 1.0f;
m_meshMaterialSpot.Emissive.g = 1.0f;
m_meshMaterialSpot.Emissive.b = 1.0f;
m_meshMaterialSpot.Emissive.a = 1.0f;
}
上面首先設置地板的材料顏色,接着就初始化聚光燈的結構m_ligthSpot,這裏選擇燈光類型爲D3DLIGHT_SPOT,顏色是白色。還設置了方向和位置,還有內圈的角度爲D3DX_PI/10,而外圈的角度爲D3DX_PI/4,從內光圈到外光圈衰減爲3.0。
其它渲染部份,同點光源是一樣的。