
Ambient
环境光
float ambientStrength = 0.1;
vec3 ambient = ambientStrength * lightColor;Diffuse
入射光线越靠近物体法线漫反射越强
// 计算漫反射值(光照向量 dot 法线)
// 注意会出现负值
float diff = max(dot(lightDir, Normal), 0.0);
// 合并
vec3 diffuse = diff * lightColor;Specular
视角向量越靠近出射光线镜面反射越强
// 强度系数
float specularStrength = 0.5;
float shininess = 32;
// 计算反射光方向向量(光照向量 dot 法线)
vec3 reflectDir = reflect(-lightDir, Normal);
// 计算镜面反射值(视角向量 dot 反射向量)
// shininess:此处pow的意义在于使光斑收敛更快(控制硬度)
float spec = pow(max(dot(viewDir, reflectDir), 0.0), shininess);
// 合并
vec3 specular = specularStrength * spec * lightColor;Phong
最终效果
vec3 result = (ambient + diffuse + specular)* objectColor;