哈嘍,上次我們有分享過Diffuse漫反射的基本光照原理,現在我們來聊一下另外一個反射,Unity中specular鏡麵高光反射解析。
在OpenGL中,光照使用的是簡化的模型,即對現實的情況進行近似,這樣處理起來會容易一些而且看起來效果也差不多。而這些光照模型都是基於我們對光的物理特性的理解。
要處理光照模型,我們有常見的三種多邊形的著色方法,分別是Flat Shading,Gouraud Shading和Phong Shading。三種效果圖如下:

1、Flat Shading
Flat shading是最簡單的著色模型,打光時每個多邊形隻會呈現一個顏色,這個顏色由麵法向量和光照計算得來。

在該模型中,每個多邊形中隻有多邊形的麵存在法向量,而其各個頂點沒有。所以早期的flat shading計算是按照麵為單位來進行計算的,計算結果並不很準確。
2、Gouraud Shading
Gouraud shading著色器模型,多邊形的每個頂點都有一個法向量,它在著色時對每個法向量進行點乘反射計算,再通過雙線性插值計算三角形區域中其它像素的顏色(比如中間像素的顏色)。

3、Phong Shading
Phong shading是三者之中最複雜的著色方法。它的特點是結合了多邊形物體表麵反射光的亮度,並以特定位置的表麵法線作為像素參考值,以插值方式來估計其他位置像素的色值。在這種情況下,多邊形中每個頂點都有一個法向量,通過這些法向量與光照計算,來得到每個點的顏色。在使用有限數量的多邊形時,對頂點法向量進行插值可以給出近似平滑的曲麵效果,所以phong會計算更多的點乘反射,運行也比上麵兩種更加複雜。

相比之下,flat著色模型比較簡單,但是後麵兩種計算方法雖然都需要應用多邊形的法向量計算出其公共頂點的法向量,也都需要計算各頂點處的光強,但在逐像素計算上還是有所區別。
Phong shading在計算的時候會將插值以後的像素點對應的法向量再次與光照進行計算,得到其著色,而gouraud shading的計算隻是對多邊形的每個頂點計算好著色,然後再使用雙線性插值方法對上麵像素進行計算,不會再將其與光照進行反射計算。
4、Obj File計算
上述三種模型在計算的時候法向量是從哪裏來的呢,我們打開一個簡單的obj格式的box文件如下;
V(Geometric vertices),表示物體中各個頂點的信息;

Vt(Texture vertices),表示貼圖坐標點;

Vn(Vertex normals),頂點法線;

F(Face),所有頂點組成的麵的信息

而這些數據中沒有麵法線的值,所以flat shading在計算光照的過程中,需要單獨根據點法線對麵法線進行計算。對GouraudShading 和 Phong Shading來說,就隻需要取值然後一頓猛算就對了.
5、Specular高光反射
Phong shading的模型主要由三個分量組成:環境(Ambient),漫反射(Diffuse)和鏡麵或者高光反射(Specular),所以下麵這張圖中,前三個加起來就會得到最後一個的效果。

環境光照指的是即使在黑暗的情況下,環境中也仍然有一些光亮,所以物體幾乎永遠不會是完全黑暗的,所以我們用這個環境光照來給物體一些顏色。
而diffuse已經在上次分享過原理以及計算過程了,所以隻需要加上我們這次探討的specular就可以完成phong的實現。
Specular是模擬光澤物體上麵出現的亮點,而鏡麵光照的顏色相比於物體的顏色會更傾向於光的顏色。
如果我們的物體是一麵鏡子,無論從哪個方向去看,都會看到鏡麵光照的最大值,真相如圖:

對於specular,我們計算的是反射向量和視線方向的角度差,如果夾角越小,那麼鏡麵光的影響就會越大。它的作用效果就是,當我們去看光被物體所反射的那個方向的時候,我們會看到一個高光。而具體在shader graph中的計算過程,我留著下一節來聊叭。
來源:Thepoly 公眾號






























