OpenGL学习笔记(6) 基础光照的计算方法
这个笔记只是冯氏光照模型下漫反射光以及镜面光照的计算方式的笔记
基础光照
基础光照分为环境光,漫反射光,镜面光照
环境光
环境光是一个常量,表示在没有光源的情况下物体的光
漫反射光
漫反射光分量的计算方式
将顶点的法向量标准化
将片段到光源的方向向量标准化
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);
对norm和lightDir向量进行点乘,计算光源对当前片段实际的漫反射影响,乘上光的颜色,得到漫反射分量,当法线和方向向量大于90度时,这个片段不会被光源照到,点乘得出来一个负值,但颜色不能是负值,所以要和0取最大
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = diff * lightColor;
如果只要环境光和漫反射光的话,得到的最终的结果是环境光加上漫反射光乘上物体的颜色,得到最后的颜色
vec3 result = (ambient + diffuse) * objectColor;
FragColor = vec4(result, 1.0);
镜面光
镜面光分量的计算方式
同样要获得顶点的法向量
先获得光源到片段的方向向量,将这个向量标准化
vec3 lightDir = normalize(lightPos - FragPos);
获得摄像机到片段的向量
使用reflect函数,将片段指向光源的向量和法向量作为参数传进去,得到一个反射向量
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);
再计算反射向量和摄像机到片段的向量的点乘和0的最大值的32次幂
float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
vec3 specular = specularStrength * spec * lightColor;
32指的是反光度(Shiness),反光度越高,反射光能力越强
基础光照输出
把环境光,漫反射光,镜面光三个分量相加,乘上物体的颜色,得到最终的颜色
vec3 result = (ambient + diffuse + specular) * objectColor;
FragColor = vec4(result, 1.0);