法线是撬开光照系统大门的铁棍
本章的目的是弄清楚法线的数学基础,让我们一齐撬开光照系统的大门吧!
法线,即标准化向量,在二维中共线的两个点或者是在三维中共面的三个点,总能找到一条直线可以垂直的穿过两个点所定义的线或者三个点所定义的面,每一条直线存在两个可计算的标准化向量(相反),他的长度满足如下公式。

为了得到法线的标准化向量,我们需要对多边形的两条线进行叉乘,并获得标准化的结果。在此之前,我们需要对向量的点乘和叉乘有一个清楚的认知。
点乘
点乘的几何意义用来计算两个向量之间的夹角,以及B向量在A向量方向上的投影,通俗的解释,点乘的大小反应了两个向量有多平行。向量方向一致,则点乘结果为1,垂直则为0

叉乘
在三维几何中,向量a和向量b的叉乘结果是一个向量,更为熟知的叫法是法向量,该向量垂直于a和b向量构成的平面。通俗意义将,叉乘结果可以反应两个向量有多垂直。
在3D图像学中,叉乘的概念非常有用,可以通过两个向量的叉乘,生成第三个垂直于a,b的法向量,从而构建X、Y、Z坐标系。如下图所示:

我们已经看过了一点法线的数学基础,因此通常刚入门的同学都会理所当然地认为法线就是一个面正方向只有一个标准法线,但其实在各大3D建模软件里面,法线是逐个顶点提供的。在建模软件中,可以通过顶点之间进行光滑线性插值来让模型的表面更加光滑。
光照
因此当光线照到一个模型上面时,我们便可以问:”光线方向与法线方向的点乘结果是什么?“如果L的向量与N一样(N Dot L=1),那么表示模型的这个点正对着光源,应该最亮,相反,如果两个向量呈相反方向(N Dot L=-1),那么则表示这个点背对光源,应该最暗。这里需要强调,光照方向是从每一个世界坐标出发,指向光源的向量,初学时很容易混淆。

当点乘积为负数结果时,它实际上是用不着的,因为渲染负方向的光照并没有什么意义,所以我们可以直接无视它。shader提供了一个saturate()方法来达成这一点,当saturate方法传入的参数为负数时,直接返回0。


参考资料:Shader从入门到跑路(13):法线与光照方向的点乘判断 - 知乎 (zhihu.com)
Shader从入门到跑路(12):法线是撬开光照系统大门的铁棍 - 知乎 (zhihu.com)