對(duì)一個(gè)四邊形定義頂點(diǎn)位置 ,頂點(diǎn)顏色 頂點(diǎn)法線
定義方向光源,光源顏色,
渲染一個(gè)四邊形,光源只對(duì)其兩個(gè)頂點(diǎn)照射:
點(diǎn)光源:point light具有位置和顏色的屬性,它在空間中占據(jù)一個(gè)點(diǎn),并向四面八方散射,光線照射到某個(gè)物體后,反射光的強(qiáng)度與物體表面的法線和入射光線的夾角有關(guān),這一點(diǎn)和方向光淚水,不同的是,因?yàn)辄c(diǎn)光源具有位置屬性,所以光線達(dá)到每個(gè)頂點(diǎn)的方向與距離不同,并且它還會(huì)光源隨著物體的距離增大而衰減,
1
//計(jì)算點(diǎn)光源,只與頂點(diǎn)位置,頂點(diǎn)法線以及光源位置有關(guān)
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
}
取四邊形的一個(gè)頂點(diǎn)位置 法線 顏色參與點(diǎn)光源的照射:
使用OpenGL自己定義的函數(shù)可以實(shí)現(xiàn)方向光,點(diǎn)光源以及聚光燈
//方向光參數(shù)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};

//點(diǎn)光源參數(shù)Light1

float vPointPosition[4]=
{0.0f,3.0f, -5.0f, 1.0f};//w=1表示點(diǎn)光源

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};
//聚光燈參數(shù)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);
}
點(diǎn)光源:

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);
);

}