Blinn-Phong光照
这个光照是在冯氏光照之后的一种改良
但是冯氏光照有个缺点
假设一个场景,这个物体的反光度很低 也就是说他的漫反射产生的亮度很低
在这个时候微弱的镜面反射就会对整个物体产生影响 然而此时你在背光处(也就是灯在你的身后方)此时就会发生
此时情况就是右边的情况
这样就会发生有的地方会突然消失镜面反射(因为夹角大于了90)就会发生下面的情况
所以为了解决这个问题Blinn-Phong光照提出了半程向量即光线与视线夹角一半方向上的一个单位向量。当半程向量与法线向量越接近时,镜面光分量就越大。
算法是`:
vec3 lightDir = normalize(lightPos - FragPos);
vec3 viewDir = normalize(viewPos - FragPos);
vec3 halfwayDir = normalize(lightDir + viewDir);`
float spec = pow(max(dot(normal, halfwayDir), 0.0), shininess);
Blinn-Phong与冯氏模型唯一的区别就是,Blinn-Phong测量的是法线与半程向量之间的夹角,而冯氏模型测量的是观察方向与反射向量间的夹角。
因为是半程向量 所以一般夹角会比真实的夹角小一些 所以我们提高反光度至原来冯氏光照的2-4倍就行
光照理论
不是应该反射入眼睛的才是镜面高光吗
按现实来说 应该是计算每一个像素如果这个像素的反射光线会正好射入眼睛才是镜面反射 但是我们这里并不是 只是做了一个点乘 最终得出来的是镜面反射度 也就是这个点乘值越大 反射光线越靠近眼睛就高光越大 主要是因为分辨率不够的原因导致一个像素可能对应的是多个纹素 导致一些像素上完全没有高光,看起来是不自然的 实际上就是起到一个模糊的效果