Lambert 是一種光照模型,在圖學裡常被用來處理漫反射(diffuse),許多shader的光照模型都是來自Lambert 的變化,比如
此篇中的Toon shader 就是使用Lambert 來做變化的。
Lambert的數學公式就是直接把光源跟模型的表面法向量(Normal)進行內積(dot)就可以得到結果了,以unity shader的寫法就是
half4 LightingSimpleLambert (SurfaceOutput s, half3 lightDir, half atten)
{
half NdotL = dot (s.Normal, lightDir); //s.Normal為模型的法向量,lightDir為光源
.....
}詳細寫法可以參考unity官網
此篇diffuse系列的部分
若是用Amplify shader editor的做法就是把world space Light dir 與world Normal這兩個node進行內積。
▲此圖為實作一個Lambert的做法
上面的Saturate是把dot出來的值給映射到0與1之間,這跟許多shader裡面寫max (0, dot (s.Normal, lightDir));是一樣的效果,因為dot出來的值會有負的,通常的情況下不希望有負值,這個在環境光只有直射光(Directional Light)時會看不出有無Saturate到底有何影響,但若是在其他光源下比如spot 或是 point light就會看出差別了。
▲左邊是沒有Saturate,右邊是有Saturate,當只有Directional Light時看不出兩者的差異
▲當前面放著一個point light時可以明顯看出(此時沒有Directional Light),沒有Saturate的物件是一片黑
Lambert的基本變化版還有 half Lambert 以及half Lambert squared,以下為使用Amplify shader editor所實作的作法
▲half Lambert ,把dot出來的值跟一個數值進行scale與offset,以上面的例子就是(x+0.5)*0.5,x為dot出來的值
▲half Lambert squared,把上面的half Lambert 的運算出來的結果再進行平方運算。
▲從左至右依序是Lambert,half Lambert squared,half Lambert。
可以看出half Lambert squared的亮度介在Lambert與half Lambert之間。