法線是撬開光照系統大門的鐵棍
本章的目的是弄清楚法線的數學基礎,讓我們一齊撬開光照系統的大門吧!
法線,即標準化向量,在二維中共線的兩個點或者是在三維中共面的三個點,總能找到一條直線可以垂直的穿過兩個點所定義的線或者三個點所定義的面,每一條直線存在兩個可計算的標準化向量(相反),他的長度滿足如下公式。

為了得到法線的標準化向量,我們需要對多邊形的兩條線進行叉乘,并獲得標準化的結果。在此之前,我們需要對向量的點乘和叉乘有一個清楚的認知。
點乘
點乘的幾何意義用來計算兩個向量之間的夾角,以及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),那么則表示這個點背對光源,應該最暗。這里需要強調,光照方向是從每一個世界坐標出發(fā),指向光源的向量,初學時很容易混淆。

當點乘積為負數結果時,它實際上是用不著的,因為渲染負方向的光照并沒有什么意義,所以我們可以直接無視它。shader提供了一個saturate()方法來達成這一點,當saturate方法傳入的參數為負數時,直接返回0。


參考資料:Shader從入門到跑路(13):法線與光照方向的點乘判斷 - 知乎 (zhihu.com)
???????????????????Shader從入門到跑路(12):法線是撬開光照系統大門的鐵棍 - 知乎 (zhihu.com)