此處根據GPU 編程與CG 語言之陽春白雪下里巴人這本書進行概括整理,對常用的一下算法收集到一塊;
常用的材質參數我會再進行整理
經典光照模型
- 漫反射 Lambert(蘭伯特)模型
- 對於僅暴露在環境光下的Lambert反射體
Cambdiff = KaCa
Ka爲材質對環境光的反射係數,Ca爲環境光顏色,Cambdiff爲物體與環境光的交互反射光顏色; - 對於暴露在方向光下的Lambert反射體
Cidiffuse = Kd (CL * Md) cosθ
Kd爲材質對漫反射光的反射係數,CL是點光線顏色,θ是物體法線與光方向的夾角,Kd同上,Cidiffuse爲物體漫反射後光線顏色, Md爲材質本身顏色;
- 對於僅暴露在環境光下的Lambert反射體
- 鏡面反射與Phong 模型
- 計算鏡面反射的Phong模型
Cspec = Ks (CL * Ms) (V·R)ns
Ks爲材質的鏡面反射係數,ns爲高光指數,V爲頂點到視點的方向向量,R代表反射光方向,Ms爲材質高光顏色;
R的求法:
R + L = 2(L·N)N //L爲頂點指向光源的方向向量,N爲法向量
可得,R = 2(L·N)N - L; - 計算鏡面反射的Blin-Phong模型
Cspec = Ks (CL * Ms) (N·H)ns
H爲L與V的中間向量,也稱半角向量,Im爲材質本身顏色;
H的求法:H = (L + V) / |L + V|;
Blin-Phong模型相比於Phong模型,減少了計算量,但模擬效果沒有Phong模型真實
- 計算鏡面反射的Phong模型
可得到經典光照模型下的光強計算公式爲:
C = KaCa + Kd (CL * Md) cosθ + Ks (CL * Ms) (V·R)ns 或
C = KaCa + Kd (CL * Md) cosθ + Ks(CL * Ms) (N·H)ns
需要的參數爲:
float:Ka、Kd、Ks;
vec3:Ca、CL,Md,Ms、V、N、L;
- Half Lambert(半蘭伯特)模型
該模型是在原模型上進行了簡單修改,公式如下:
Iidiffuse = Kd (IL * Im)(α * cosθ + β)
- 與原模型相比,對cosθ進行了一個α倍的縮放,和一個β大小的偏移;
- 絕大多數情況下,α、β的值取0.5。即:
Iidiffuse = Kd (IL * Im)(0.5cosθ + 0.5) - 用途:可替換經典光照模型中的Lambert模型;
- Fresnel Reflection(菲涅爾反射)
光線照射到透明物體上時,一部分發生反射,一部分進入物體內部並在介質交界處發生折射,被反射和折射的光通量存在一定的比率關係,這個比率關係可以通過Fresnel 定律進行計算。
- 通常我們所說的fresnel 係數指“反射係數“;如果fresnel爲0.7,那麼被反射光線就佔70%,穿過表面的折射光線則是30%。
- 我們用Kr 表示fresnel 反射係數,用Kt表示折射係數
- 用途:在渲染具有反射和折射的透明物體時,配合環境紋理使用;
關於高級光照模型等我學會了再寫==