Lambert 光照模型(環境光+漫反射)
Idiff = kd * Ia + kd * Il * (N·L) = kd * Ia + kd * Il * dot(N, L)
Ia 是環境光的強度
kd 爲材質對環境光的反射係數(0 < kd < 1)
Il 是方向光的強度
kd 爲材質對環境光的反射係數(0 < kd < 1)
θ 是入射光方向和頂點法線的夾角。當夾角爲 0°,說明入射光平行於法線(垂直於表面),此時反射強度最大;當夾角爲 90° 時,說明入射光同表面頂點切線平行,此時物體不會反射任何光線。
N 頂點單位法向量
L 與從頂點指向光源的單位向量
Unity 中的 Lambert 光照模型的源碼:
inline fixed4 UnityLambertLight (SurfaceOutput s, UnityLight light)
{
fixed diff = max (0, dot (s.Normal, light.dir));
fixed4 c;
c.rgb = s.Albedo * light.color * diff;
c.a = s.Alpha;
return c;
}
--------------------
Half Lambert 光照模型(環境光+漫反射+提亮暗部)
Half Lambert 用來給在比較暗的區域顯示物體
inline half4 LightingCustomLambert(SurfaceOutput s, half3 lightDir, half atten)
{
// Lambert
half diffLight = dot(s.Normal, lightDir);
// half Lambert
diffLight = diffLight * 0.5 + 0.5;
half4 c;
c.rgb = s.Albedo * _LightColor0.rgb * (diffLight * atten * 1);
c.a = s.Alpha;
return c;
}
在 Lambert 的基礎上,通過 diffLight = diffLight * 0.5 + 0.5,使得 diffLight 變大了從而增強了在光線暗的區域的視覺效果。
--------------------
Phong 光照模型(環境光+漫反射+高光反射)
Phong在Lambert模型的基礎上,加入對光滑表面的高光反射
Ispec = ks * Il * (R·V) ^ p
R + L = 2 * N * (N·L) = > R = 2 * N * (N·L) - L
得到:Ispec = ks * Il * ((2 * N * (N·L) - L)·V) ^ p
ks 是材質的鏡面反射係數
Il 是光強
R 爲反射光的方向
V 表示從頂點到視點的方向
p 是高光指數,p 越大反射越集中,當慢慢視線方向偏離反射方向光線開始慢慢衰減,反之 p 越小觀察到的光斑區域也就越小,反射光強度也很弱。
N 單位法向量
L 從頂點指向光源的單位向量
--------------------
Blin-Phong光照模型(環境光+漫反射+高光反射,表現和Phong 光照模型差不多,但優化了效率)
Ispec = ks * Il * (N·H) ^ p
ks 是材質的鏡面反射係數
Il 是光強
N 爲入射點的單位法向量
H 表示光線方向和視角方向的半角向量
p 是高光指數,p 越大反射越集中,當慢慢視線方向偏離反射方向光線開始慢慢衰減,反之 p 越小觀察到的光斑區域也就越小,反射光強度也很弱
用到了視角方向和光線方向構成的半角向量
Unity 中的 BlinnPhong 光照模型的代碼:
inline fixed4 UnityBlinnPhongLight (SurfaceOutput s, half3 viewDir, UnityLight light)
{
half3 h = normalize (light.dir + viewDir);
fixed diff = max (0, dot (s.Normal, light.dir));
float nh = max (0, dot (s.Normal, h));
float spec = pow (nh, s.Specular*128.0) * s.Gloss;
fixed4 c;
c.rgb = s.Albedo * light.color * diff + light.color * _SpecColor.rgb * spec;
c.a = s.Alpha;
return c;
}
首先計算了光線方向和視角方向的半角向量 h,接着計算了 Lambert 光照模型中計算光強的乘法因子 diff,然後又計算了法向量和 h 的點積 nh,
最後通過指數計算得到了高光乘法因子 spec,最終輸出就是 Lambert 光照模型得到的漫反射值以及 BlinnPhong 光照模型得到的高光反射值的和
--------------------
BRDF
基於物理的光照模型
一次反射光照的計算是在光線交點的法線半球上的球面積分
雙向反射分佈函數(Bidirectional Reflectance Distribution Function,BRDF)用來定義給定入射方向上的輻射照度(Irradiance)如何影響給定出射方向上的輻射率(Radiance)。
宏觀來看,它描述了入射光線經過某個表面反射後如何在各個出射方向上分佈——可以是從理想鏡面反射到漫反射、各向同性(Isotropic)或者各向異性(Anisotropic)的各種反射。
計算機圖形學中實現BRDF理論模型的一個方法是用微小面元對物體表面進行建模,每一個小平面都是表面上的一個小平面鏡,具有隨機的大小和角度。這些小平面通常被賦予一個高斯分佈的尺寸和角度。
--------------------
BSSRDF
基於物理的光照模型
用於模擬皮膚,BSSRDF可以指定不同的光線入射位置和出射的位置
每一次反射在物體表面上每一個位置都要做一次半球面積分,是一個嵌套積分
最初來源於Jensen在2001年的論文是次表面材質建模最重要的一篇論文[Jensen, Henrik Wann, Stephen R. Marschner, Marc Levoy, and Pat Hanrahan. 2001. "A Practical Model for Subsurface Light Transport." In Proceedings of SIGGRAPH 2001.],
推導了許多重要的物理公式,計算模型,渲染時的參數轉換,以及測量了許多生活中常見材質的散射係數等
BSSRDF的定義是: