MME編寫入門(五)簡(jiǎn)單光照模型 補(bǔ)充說明
在第四篇的簡(jiǎn)單光照模型中,做了一個(gè)簡(jiǎn)單的卡通著色器。對(duì)的,講的思路是馮氏著色的方法,但是最后做出來的實(shí)際上是卡通著色。
原因很簡(jiǎn)單,是因?yàn)橄袼刂骼?這一行的效果。
什么是lerp?什么是saturate?為什么要 LightNormal*16+0.5?
為了方便觀察,在這里放置一個(gè)球。球可以在PE里快速建出,記得隨便貼上個(gè)純色的貼圖,還有toon。放上簡(jiǎn)單光照的fx效果,如圖。光照部分和陰影部分有較為明顯的二分。所以是非真實(shí)感渲染 (Non-Photorealistic Rendering) ,NPR。

實(shí)際上把后面的*16+0.5刪掉就可以得到?真實(shí)感渲染(Photorealistic rendering)。


為了看得更明顯,所以這里調(diào)整了一下強(qiáng)度和顏色??梢钥吹竭@種層層的漸變效果。真實(shí)渲染?旨在渲染真實(shí)感的畫面,而NPR則追求更加有藝術(shù)感的畫面效果。
回到最開始的問題,什么是lerp?
lerp函數(shù),是經(jīng)常用的插值函數(shù)。其意義是 lerp(a,b,w),計(jì)算 a + w*(b-a),在a和b之間插值,w表示權(quán)值,范圍0~1。
為了看得更明顯,我們可以把前邊的MaterialToon改成float3(0,0,0),這樣就是黑色,與白色,進(jìn)行插值。

saturate函數(shù),很好理解,saturate(x)將x的數(shù)值,截取在0-1之間。
接下來我們更改一下LightNormal*16,從左到右依次是*32,*64??梢钥吹剑吘壍膹?qiáng)烈分割。

還有一個(gè)插值函數(shù),smoothstep,作用和用法跟lerp一致,但兩者之間有一定的區(qū)別,這里不多贅述,因?yàn)橛貌坏???梢越梃b學(xué)習(xí)https://blog.csdn.net/qq_41835314/article/details/128618789
最后一個(gè)問題,為什么要?LightNormal*16+0.5?
通過修改數(shù)值能夠有所體會(huì),若想究其原理,需要拿出紙筆,動(dòng)手算算或者思考一下。
1.在球的光照亮面取一個(gè)點(diǎn),邊緣上取一個(gè)點(diǎn),暗面取一個(gè)點(diǎn)。
2.用float LightNormal = dot(Normal,-LightDirection)
分別算出LightNormal的正負(fù),大小的排序。
3.saturate(LightNormal*16+0.5),取得三者權(quán)重,然后分別插值。
關(guān)于HLSL中的函數(shù),這里就不搬運(yùn)了,參考微軟官方文檔,或者參考https://blog.csdn.net/eloudy/article/details/71258367