
方向光的計算只與頂點法線和光源放方向有關,其光照的結果是頂點法線與入射角形成的夾角的cos值*光源強度
void CalculateDirectionalLight (Vertex_PCN *pVertices, int num_vertices){2
for(int i=0;i<num_vertices;i++){3
//求出轉換后在世界坐標系的頂點法線;4
Vector4 vNormal= g_world_matrix.RotateVector (pVertices[i].m_normal );5
Vector4 vIntensity=Vector3Dot(vNormal,g_vLightDirection);//頂點法線和光線方向的夾角,決定反射光的強度6
// `累加上計算出來方向光的強度`7
pVertices[i].m_color += vIntensity * g_vLightColor;8
9
}10
}對一個四邊形定義頂點位置 ,頂點顏色 頂點法線
定義方向光源,光源顏色,
渲染一個四邊形,光源只對其兩個頂點照射:

點光源:point light具有位置和顏色的屬性,它在空間中占據一個點,并向四面八方散射,光線照射到某個物體后,反射光的強度與物體表面的法線和入射光線的夾角有關,這一點和方向光淚水,不同的是,因為點光源具有位置屬性,所以光線達到每個頂點的方向與距離不同,并且它還會光源隨著物體的距離增大而衰減,
//計算點光源,只與頂點位置,頂點法線以及光源位置有關
2
void CalculatePointLight (Vertex_PCN *pVertices, int num_vertices){
3
float fSpotLightCutoffCos=FastMath::Cos (FastMath::DegreeToRadian (g_fSpotLightCutoff));
4
for(int i=0;i<num_vertices;i++){
5
Vector4 vPosition=pVertices[i].m_position *g_world_matrix;
6
Vector4 vNormal=g_world_matrix.RotateVector (pVertices[i].m_normal );
7
Vector4 vVertex_to_Light=g_vLightPosition-vPosition;
8
float light_distance=vVertex_to_Light.NormalizeAndGetLength ();
9
Vector4 vDistance(1.0,light_distance,light_distance*light_distance);
10
Vector4 vAttenuation=Vector3Dot(vDistance,g_vLightAttenuation);
11
Vector4 vIntensity=Vector3Dot(vNormal,vVertex_to_Light);
12
pVertices[i].m_color +=vIntensity*g_vLightColor/vAttenuation;
13
}
14
}

使用OpenGL自己定義的函數可以實現方向光,點光源以及聚光燈
//方向光參數light0
float vDirection[4]={0.0f, 1.0f, 0.0f, 0.0f};//w=0,表示平行光
float vDirAmbientColor[4]={0.0f, 0.0f, 0.0f, 1.0f};
float vDirDiffuseColor[4]={1.0f, 0.0f, 0.0f, 1.0f};
//點光源參數Light1
float vPointPosition[4]={0.0f,3.0f, -5.0f, 1.0f};//w=1表示點光源
float vPoiAmbientColor[4]={0.0f, 0.0f, 0.0f, 1.0f};
float vPoiDiffuseColor[4]={0.0f, 1.0f, 0.0f, 1.0f};
float vPoiAttenuation[4]={2.0f, 1.0f, 0.5f};
//聚光燈參數Light2
float vSpotPoint[4]={0.0f, 10.0f, 0.0f, 1.0f};//w=1
float vSpotDirection[4]={0.0f, 0.0f,-1.0f, 0.0f};
float vSpotAmbientColor[4]={0.0f, 0.0f, 0.0f, 1.0f};
float vSpotDiffuseColor[4]={0.0f, 0.0f, 1.0f, 1.0f};
float vSpotAttenuationg[4]={1.0f, 1.0f, 0.0f};
float mfSpotLightCutoff=20;
float mfSpotLightExponent=5;

方向光:
void Light::SetDirectionLight() {
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_POSITION, vDirection);
} 點光源:
void Light::SetPointLight (){
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
// `光源位置`
glLightfv(GL_LIGHT0, GL_POSITION, vPointPosition);
// `隨距離的衰減值 `
// 1/(CONSTANT + LINEAR*d + QUADRATIC*d^2) `公式中的CONSTANT,LINEAR,QUADRATIC值`
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, vPoiAttenuation[0]);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, vPoiAttenuation[1]);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION,vPoiAttenuation[2]);
}聚光燈:
void Light::SetSpotLight (){
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
// `光源位置`
glLightfv(GL_LIGHT0, GL_POSITION, vSpotPoint);
// `隨距離的衰減值`
// 1/(CONSTANT + LINEAR*d + QUADRATIC*d^2) `公式中的CONSTANT, LINEAR, QUADRATIC值`
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, vSpotAttenuationg[0]);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, vSpotAttenuationg[1]);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, vSpotAttenuationg[2]);
// `光柱的方向`
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, vSpotDirection);
// `光柱圓錐的一半角度`
glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, mfSpotLightCutoff);
// `光柱圓錐的角度衰減`
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, mfSpotLightExponent);
);
}





