首先,定义一个全局光:
float globalAmbient[4]={0.7f,0.7f,0.7f,1.0f};
再定义光照:
float initiaLightLoc[3]={5.0f,5.0f,0.0f};
float globalAmbient[4]={0.7f,0.7f,0.7f,1.0f};
float lightAmbient[4]={0.0f,0.0f,0.0f,1.0f};
float lightDiffuse[4]={1.0f,1.0f,1.0f,1.0f};
float lightSpecular[4]={1.0f,1.0f,1.0f,1.0f};
再定义材质:
float matA[4]={0.24725f,0.1995f,0.0745f,1.0f};
float matD[4]={0.75164f,0.60648f,0.f,1.0f};
float matS[4]={0.62828f,0.5558f,0.36607f,1.0f};
float matShi=51.2f;
修改顶点着色器:
#version 430
layout (location = 0) in vec3 vPosition;
layout (location = 1) in vec3 vNormal;
out vec4 varyingColor;
uniform vec4 globalAmbient;
struct PositionalLight
{
vec4 ambient;
vec4 diffuse;
vec4 specular;
vec3 position;
};
struct Material
{
vec4 ambient;
vec4 diffuse;
vec4 specular;
float shininess;
};
uniform PositionalLight light;
uniform Material material;
uniform mat4 mv_matrix;
uniform mat4 proj_matrix;
uniform mat4 norm_matrix;
void main(void)
{
vec4 P=mv_matrix*vec4(vPosition,1.0);
vec3 N=normalize((norm_matrix*vec4(vNormal,1.0)).xyz);
vec3 L=normalize(light.position-P.xyz);
vec3 V=normalize(-P.xyz);
vec3 R=reflect(-L,N);
vec3 ambient=((globalAmbient*material.ambient)+(light.ambient*material.ambient)).xyz;
vec3 diffuse=light.diffuse.xyz*material.diffuse.xyz*max(dot(N,L),0.0);
vec3 specular=material.specular.xyz*light.specular.xyz*pow(max(dot(R,V),0.0f),material.shininess);
varyingColor=vec4((ambient+diffuse+specular),1.0);
gl_Position = proj_matrix * mv_matrix * vec4(vPosition,1.0);
}
片段着色器
#version 430
in vec4 varyingColor;
out vec4 fragColor;
void main(void)
{
fragColor=varyingColor;
}
光照初始化(刷新):
void initiateLight(glm::mat4 vMatrix)
{
lightPosV=glm::vec3(vMatrix*glm::vec4(currentLightPos,1.0));
lightPos=glm::vec3(lightPosV.x,lightPosV.y,lightPosV.z);
globalAmbLoc=glGetUniformLocation(renderingProgram,"globalAmbient");
ambLoc=glGetUniformLocation(renderingProgram,"light.ambient");
diffLoc=glGetUniformLocation(renderingProgram,"light.diffuse");
specLoc=glGetUniformLocation(renderingProgram,"light.specular");
posLoc=glGetUniformLocation(renderingProgram,"light.position");
mAmbLoc=glGetUniformLocation(renderingProgram,"material.ambient");
mDiffLoc=glGetUniformLocation(renderingProgram,"material.diffuse");
mSpecLoc=glGetUniformLocation(renderingProgram,"material.specular");
mShiLoc=glGetUniformLocation(renderingProgram,"material.shininess");
glUniform4fv(globalAmbLoc,1,&globalAmbient[0]);
glUniform4fv(ambLoc,1,&lightAmbient[0]);
glUniform4fv(diffLoc,1,&lightDiffuse[0]);
glUniform4fv(specLoc,1,&lightSpecular[0]);
glUniform3fv(posLoc,1,&lightPos[0]);
glUniform4fv(mAmbLoc,1,&matA[0]);
glUniform4fv(mDiffLoc,1,&matD[0]);
glUniform4fv(mSpecLoc,1,&matS[0]);
glUniform1fv(mShiLoc,1,&matShi);
}
绘图主程序中添加:
initiateLight(scene.vMat);
最后是光照效果: