Basic Light
Phong Lighting Model
一个物体所受的光照 = 环境(Ambient) + 漫反射(Diffuse) + 镜面(Specular)
Ambient
把环境光照添加到场景里非常简单。我们用光的颜色乘以一个很小的常量环境因子,再乘以物体的颜色,然后将最终结果作为片段的颜色:
void main()
{
float ambientStrength = 0.1;
vec3 ambient = ambientStrength * lightColor;
vec3 result = ambient * objectColor;
FragColor = vec4(result, 1.0);
}
Diffuse
//漫反射光
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);
float dif = max(dot(norm , lightDir) , 0.0f);
vec3 diffuse = dif * lightColor;
Specular
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir , norm);
float spec = pow(max(dot(viewDir , reflectDir) , 0.0f) , 32);
vec3 specular = specularStrength * spec * lightColor;
32 为高光的反光度 越大反射的高光越收缩 反之越分散
将法线从模型空间变换到视觉空间
对于法线是没有其次坐标的 对于法线 为了不改变法线的方向 需要使用特定的法线矩阵将法线从模型空间变换到视觉空间