Shader入門精要學習-基礎光照
什么是光照模型
根據材質屬性,光源信息,使用一個等式去計算沿著某個觀察方向出射光線的數量和方向(出射度)的過程,也稱為光照模型。不同的光照模型有不同的目的,例如粗糙表面和金屬表面。
如何計算光照模型
在光學里,我們使用輻照度來量化光,計算光照模型時,必須要知道一個物體表面的輻照度,通常情況下,可以使用光源方向l和表面法線n之間的夾角的余弦值得到(l與n之間的點積成正比)
標準光照模型
標準光照模型只關心直接光照(經過物體表面一次反射后進入到攝像機的光線),其計算方法是把進入攝像機內的光線分為四個部分,每個部分使用一種方法來計算他的貢獻度。
? ??1.自發(fā)光:Cmissive表示,給定一個方向,物體表面本身會朝該方向發(fā)射多少輻射量。
????2.高光反射: Cspecular表示,給定光源,完全鏡面反射方向散射多少輻射量
????3.漫反射:Cdiffuse, 描述光線照射到模型時,該表面會朝每個方向散射多少輻射量
????4.環(huán)境光:Cambinet,描述其他所有的間接光照
漫發(fā)射計算
漫發(fā)射光照符合蘭伯特定律,反射光線的強度和表面法線和光源方向之間的夾角的余弦值成成正比
計算公式: 光源顏色 * 物體漫反射材質顏色 *? max(表面法線? 點乘 光源方向)
為了防止點乘結果為負需要取最大值,防止物體被從后面來的光源照亮。
高光反射計算
? ? 這里的高光發(fā)射是一種經驗模型,可以用于計算看上去有光澤的材質,例如金屬,并不完全符合真實世界中的高光反射。計算高光發(fā)射需要表面法線,視角方向,光源方向,反射方向的單位矢量。
計算公式: 直射光顏色 * pow(max(dot(當前點的反射光方向,當前點到攝像機的方向),0),高光反射參數)

逐像素計算or逐頂點計算
在得到光照模型的計算公式之后,就可以著手準備實現基礎光照模型,通常我們有兩種選擇,在片元著色器中計算,即逐像素光照,或者在頂點著色器中計算,即逐頂點光照。
逐像素光照以每個像素為基礎,得到它的法線(對頂點法線插值得到,或者從法線紋理中采樣得到)然后進行光照模型計算,這種在面片之間對頂點法線進行插值的技術被稱為Phong著色或者法線插值著色技術。
逐頂點光照,在每個頂點上計算光照,然后在渲染圖元內部進行線性插值,最后輸出成像素顏色,由于頂點數目遠遠小于像素數目,計算量也會比逐像素光照小很多,但是由于逐頂點光照依賴線性插值得到像素光照,當光照模型中有非線性的計算時,就會出現問題。
補充:環(huán)境光獲取,通過Unity內置變量 UNITY_LIGHTMODEL_AMBIENT可以得到環(huán)境光的顏色和強度。