小屋創作

日誌2019-08-12 03:01

Unity shader Light model - Lambert 光照模型

作者:Adisa

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之間。


4

0

LINE 分享

相關創作

[心得] 蟹蟹尋寶奇遇(Another Crab's Treasure),搞怪好玩的卡通式魂類遊戲

Unity Localization Smart String 不會自動刷新這回事

月底製作日誌兼雜談-第51回(2024/04)

留言

開啟 APP

face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】