Unity 學(xué)習(xí)第五篇:Lambert (蘭伯特)光照模型
漫反射的定義
漫反射是投射在粗糙表面上的光向各個(gè)方向反射的現(xiàn)象。當(dāng)一束平行的入射光線射到粗糙的表面時(shí),表面會(huì)把光線向著四面八方反射,所以入射線雖然互相平行,由于各點(diǎn)的法線方向不一致,造成反射光線向不同的方向無規(guī)則地反射,這種反射稱之為“漫反射”或“漫射”。這種反射的光稱為漫射光。
Lambert定律
漫反射光的強(qiáng)度近似地服從于Lambert定律,即漫反射光的光強(qiáng)與表面法線和光源方向之間的夾角的余弦成正比。

原理公式:diffuse = I*cosθ;
diffuse:反射光線的的光強(qiáng);
I:入射光線的光強(qiáng),方向如上圖所示;
cosθ:光源方向和該頂點(diǎn)法線的余弦,光源方向 · 法線方向,cosθ = dot(L,N);
在Unity中當(dāng)顏色值小0時(shí)會(huì)按0處理,所以我們最后的數(shù)學(xué)表達(dá)式為:diffuse = I*max(0,dot(L,N));
在Unity Shader
半蘭伯特光照模型
把上面的效果應(yīng)用到Unity中,可以看出不被光照射的背面是比較暗的,此時(shí)我們可以優(yōu)化蘭伯特光照模型,有人提出了半蘭伯特光照模型。
由上面的公式diffuse = I*max(0,dot(N,L))
,可知dot(N,L)
的范圍為-1~1,如果我們可以把范圍調(diào)整為0 ~1,那么模型看起來會(huì)更亮些,我們優(yōu)化下讓?dot(L,N)*0.5+0.5
,這樣范圍就改為了0 ~1。
最后的公式為:diffuse = I*max(0,dot(N,L)*0.5+0.5)
半蘭伯特Shader程序
從相同的視角來觀察兩個(gè)模型,效果對(duì)比如下:

標(biāo)簽: