提出问题

在右图情况下spec值为负值,导致当观察者与光照相对法线同侧时,对侧的光线会被减弱甚至消除,如图:

解决问题:半程向量
警告
半程向量本质上不是由数学原理推导得出,仅是由经验的方法凑巧实现的效果,实际上在数值上并不准确,但在视觉美学上是可取的。

代码实现:
vec3 halfwayDir = normalize(lightDir + viewDir);
spec = pow(max(dot(normal, halfwayDir),0.0), 1.0);使用半程向量与法线的夹角作为镜面反射值,这样物理观察者在哪侧,都不会出现负值。
效果:
