《OGL dev》Etay Meiri Tutorial 18 - Diffuse Lighting 笔记

Lambert's cosine law(兰伯特余弦定律),从理想漫反射表面观察到的发光强度与入射光方向与表面法线的夹角θ的余弦成正比,I=I0cos(θ)I = I_0 cos(θ)

  • 注意,这里的入射光方向是指向光源的。

因此,diffuse light为入射光颜色因子,乘以表面颜色,乘以入射光强度,乘以入射光方向与表面法线夹角的余弦值。

  • 例外,当光线从背面照射表面,即夹角为钝角时,不对表面发光强度造成任何影响。

通常一个表面只有一条法线,所以每个表面的diffuse light相同,三棱锥、立方体等棱角分明的图形没有问题,但球体的表现效果就非常糟糕,相邻的表面之间的过渡不平滑。

Phong插值解决了这个问题:

  1. 求出共享一个顶点的所有表面的法线的平均值,称为vertex normal(顶点法线)。
  2. 将vertex normal进行插值得到每个像素上的法线
  3. 然后在fragment shader中计算每个像素的diffuse light。

入射光线通常是世界空间中的向量,因此法线也必须变换到世界空间,这个变换称为法线变换。必须注意,世界变换后法线可能不再垂直于表面,可以推导出,法线变换是世界变换矩阵的逆的转置。当世界变换是一个正交变换(三个轴的缩放相同),变换后法线依旧垂直于表面,这时法线变换就是世界变换。

三角形的表面法线,通过从第一个顶点到第二个顶点的向量,与第一个顶点到第三个顶点的向量的叉积计算。(顺时针为正面)