根据教程:ogldev一步步开始,记录学习历程
之前完成环境光和漫射光的学习。环境光的计算只由光强来决定,场景中所有位置是同一亮度;漫射光的计算由光强和光的方向一同决定,相关博文如下:
镜面反射光
镜面反射光是当光线以一定的角度照射到物体表面后,从法线的另一侧堆成的角度反射出去的光线
所以这个光线就与相机的位置有关,如果相机的位置正好在反射光线上则能感受到反射光线的照射,如果相机离反射光线有一定的角度则感受到反射光线的照射效果稍弱。
观察下图:
- I:入射光
- N:表面法向量
- R:反射光,与I关于法线对称,方向相反
- V:入射点到相机视点的向量,代表观察视线
- α:反射光R和观察视线V的夹角
由图可知当α(即反射光和观察视线的夹角)为0时,反射光的强度最大;随着α的角度不断增大,反射光的强度逐渐减小,当α为90°(即反射光和观察者视线垂直)时,感受不到反射光。
引入α的余弦值,正好可以表示这种关系:
- 当α为0°时,α的余弦值为1,此时反射光强最大
- 随着α值逐渐增大,余弦值逐渐减小
- α为90°时,余弦值为0,继续增大值为负数则判定光强也为0
计算夹角α:
夹角α可以用,R(反射光)和V(观察视线)的点积来得到,关于点积的相关知识之前相机空间的博文中有讲到:
OpenGL学习之路11—-相机空间
计算观察视线V: 可以通过相机位置与入射点位置的差得到。(单位化)
计算反射光R:
根据图中所示,我们可以引入一个向量W来计算反射光R:
R = I + W
而W的长度即为,两倍的向量I在单位法向量N的相反向量(-N)上的投影的长度,而这个投影长度可以使用点积得到,W的方向跟单位法向量相同,所以向量W:
W = 2 * N * (-N · I)
所以,反射光结合两个等式可以得到:
R = I + 2 * N * (-N · I)
= I - 2 * N * ( N ·