代碼
D3DXCOLOR SceneLightMgr::calDirectionalLight (D3DXVECTOR3 /*f3VerPos*/, D3DXVECTOR3 f3Normal, D3DXVECTOR3 f3LightDir,
D3DXCOLOR f4LightColor)
{
D3DXCOLOR f4OutCol (0, 0, 0, 1);
D3DXVec3Normalize (&f3LightDir, &f3LightDir);
D3DXVECTOR3 InvDir = - f3LightDir;
float f0 = D3DXVec3Dot (&f3Normal, &InvDir);
if (f0 >= 0)
f4OutCol = f0 * f4LightColor;
f4OutCol.a = 1;
return f4OutCol;
}
D3DXCOLOR SceneLightMgr::calPointLight (D3DXVECTOR3 f3VerPos, D3DXVECTOR3 f3Normal, D3DXVECTOR3 f3LightPos, D3DXCOLOR f4LightColor,
float fRange, D3DXVECTOR3 f3Attenuation)
{
D3DXCOLOR f4OutCol (0, 0, 0, 1);
D3DXVECTOR3 f3LightVec = f3LightPos - f3VerPos;
float fRadius = D3DXVec3Length (&f3LightVec);
if (fRadius <= fRange)
{
D3DXVec3Normalize (&f3LightVec, &f3LightVec);
float f0 = D3DXVec3Dot (&f3Normal, &f3LightVec);
float fAtten = 1;
if (f0 >= 0)
{
fAtten = 1 - pow (fRadius / fRange, f3Attenuation.x);
//fAtten = 1.f/(f3Attenuation.x + f3Attenuation.y*fRadius + f3Attenuation.z*fRadius*fRadius);
if (fAtten < 0)
fAtten = 0;
if (fAtten > 1)
fAtten = 1;
f4OutCol = f0 * f4LightColor * fAtten;
}
}
f4OutCol.a = 1;
return f4OutCol;
}
D3DXCOLOR SceneLightMgr::calSpotLight (D3DXVECTOR3 f3VerPos, D3DXVECTOR3 f3Normal, D3DXVECTOR3 f3LightPos, D3DXVECTOR3 f3LightDir,
D3DXCOLOR f4LightColor, float fRange, D3DXVECTOR3 f3Attenuation, float fFalloff,
float fTheta, float fPhi)
{
D3DXCOLOR f4OutCol (0, 0, 0, 1);
D3DXVECTOR3 f3LightVec = f3LightPos - f3VerPos;
float fRadius = D3DXVec3Length (&f3LightVec);
if (fRadius <= fRange)
{
D3DXVec3Normalize (&f3LightVec, &f3LightVec);
D3DXVec3Normalize (&f3LightDir, &f3LightDir);
float f0 = D3DXVec3Dot (&f3Normal, &f3LightVec);
float fAtten = 1;
if (f0 >= 0)
{
D3DXVECTOR3 InvLightVec = -f3LightVec;
float fRho = D3DXVec3Dot (&InvLightVec, &f3LightDir);//dot (-f3LitVec, normalize(f3LightDir));
float fCosTheta = cosf (fTheta/2);
float fCosPhi = cosf (fPhi/2);
if (fRho > fCosTheta)
fAtten = 1;
else if (fRho < fCosPhi)
fAtten = 0;
else
{
fAtten = pow((fRho - fCosPhi)/(fCosTheta - fCosPhi), fFalloff);
if (fAtten < 0)
fAtten = 0;
if (fAtten > 1)
fAtten = 1;
}
fAtten *= 1 - pow (fRadius / fRange, f3Attenuation.x);
//fAtten *= 1.f/(f3Attenuation.x + f3Attenuation.y*fRadius + f3Attenuation.z*fRadius*fRadius);
if (fAtten < 0)
fAtten = 0;
if (fAtten > 1)
fAtten = 1;
f4OutCol = f0 * f4LightColor * fAtten;
}
}
f4OutCol.a = 1;
return f4OutCol;
}