添加一个反光度(Shininess)分量,结合上述的三个颜色,我们就有了全部所需的材质属性了:
#version 330 core
struct Material {
vec3 ambient; //物体表面颜色
vec3 diffuse; //漫反射光照下表面的颜色
vec3 specular; //表面上镜面高光的颜色
float shininess; //镜面高光的散射/半径
};
uniform Material material;
着色器中光照的计算就需要改为材质的新属性,物体的每个材质属性都乘上了它们各自对应的光照分量:
void main()
{
// 环境光
vec3 ambient = lightColor * material.ambient;
// 漫反射
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = lightColor * (diff * material.diffuse);
// 镜面光
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
vec3 specular = lightColor * (spec * material.specular);
vec3 result = ambient + diffuse + specular;
FragColor = vec4(result, 1.0);
}
这样显示出来的立方体很亮,显得不真实
光源对环境光、漫反射和镜面光分量也分别具有不同的强度,因此光照也有环境光、漫反射和镜面光的强度向量。
struct Light {
vec3 position;
vec3 ambient;
vec3 diffuse;
vec3 specular;
};
uniform Light light;
vec3 ambient = light.ambient * material.ambient;
vec3 diffuse = light.diffuse * (diff * material.diffuse);
vec3 specular = light.specular * (spec * material.specular);
效果:
