作業(yè)三筆記
phong:視角方向和光反射方向越重合,越亮。

前面這里是求視角方向和光反射方向的重合程度,首先對光方向求反(因為默認(rèn)是指向光源)然后用反射節(jié)點求出光關(guān)于法線方向的反射方向,然后點積視角方向得出重合程度。
這一大串節(jié)點其實可以萎縮成下面這三個,原因一目了然。

上面求出重合程度后,還需要做兩個處理輸出,一個是去掉負(fù)值,一個是改變高光范圍。power節(jié)點取大于一的冪的時候,值越大,暗處會越暗(0-1時)(具體看上上篇筆記)。

blinn phong:視半角方向和法線方向越重合,越亮。
節(jié)點和上面差不多,重合,處理。

兩者差別,phong質(zhì)量更高,尤其逆光處,但開銷會比bphong大一些。

下面的內(nèi)容是oldschool(即蘭伯特加布林馮的shader)的代碼實現(xiàn)。并以此,我講一下個人目前對代碼的理解。
首先是暴露參數(shù),這個ppt講得很清楚,不多說。

然后排除掉模板部分,剩下有四大部分,首先是輸入結(jié)構(gòu)和輸出結(jié)構(gòu)(可以理解為java的類(因為我對java比較熟一點,下面我都用java來類比吧))輸入類里面的成員變量寫的是要從模型中取讀什么數(shù)據(jù)。然后輸出類就是經(jīng)過頂點著色器方法后,返回的輸出類中的成員變量有啥。
頂點著色器就可以理解為一個返回值為輸出類,輸入值為輸入類的方法。在下面例子中,輸入類從模型中取讀了頂點和法線信息。然后把輸入類傳入頂點著色器方法,方法中首先新建一個對象o,然后給o這個輸出類對象的三個屬性賦值。比如o.posWS,表示物體的頂點世界位置。(注意雖然叫做輸入類輸出類,但實際上他們代表的對象都是物體。)這個物體的頂點世界位置需要用物體的自身頂點位置信息,乘以一個變換矩陣,才得到,然后賦給輸出類的posWS屬性。其他也是一樣,通過對輸入類的信息或者unity自帶的信息處理,給輸出類定義的變量賦值。

頂點著色器返回的o會進(jìn)入像素著色器,然后連連看里面節(jié)點的功能,也是在這里實現(xiàn)。這個代碼應(yīng)該挺好理解的,首先吧需要用到的向量準(zhǔn)備好,然后需要的點乘也準(zhǔn)備好,最后實現(xiàn)模型。

上面的是blinnphong的代碼,稍加修改(不會的就看連連看出來的代碼)就可以實現(xiàn)馮的。



然后是上次腦花的復(fù)現(xiàn)。

我看了下老師的解析后,做了些自己的改動。
最終總結(jié)出來節(jié)點分為五個部分:

第一部分是很熟悉的布林馮部分,就是布林馮光照模型。

第二部分我稱為腦花部分,UVcood節(jié)點記錄了采樣的UV坐標(biāo),乘以不同的值后再連到texture節(jié)點就可以對貼圖進(jìn)行不同大小的采樣,這里采了一大一小兩個樣然后乘起來。(我中間加oneminus節(jié)點是因為我的貼圖太黑了,我想要以白為主,線條為黑的,power節(jié)點則是為了加深黑色線條,因為直接乘出來后的黑色線條太淺了,總之都是因為我的貼圖找得不夠好而做出的修改節(jié)點,不是必要的)之后lerp灰色,來讓腦花圖變灰。


腦花部分乘以布林馮部分,得到一個結(jié)合版腦花

第三高光部分,round四舍五入取出高光,然后乘以顏色改變高光顏色。


第四部分是底色部分,這里完全是我自己寫的。雖然說幾乎是純色節(jié)點,但直接賦予純色的話會看不出模型輪廓,這里我用取綠通道(差不多獲得一個光從上往下照的模型)后,用類似半蘭伯特的方法,把亮的部分變得很大(加的時候不是加0.5而是多加點),乘以顏色后獲得底色。


第五部分是造出二層底色,首先把上面的結(jié)合版腦花power一個值改變高光范圍,然后再round,然后加一個值讓他變灰而不是純黑白,然后再clamp(因為上面加后會出現(xiàn)超過1的部分)

得到這樣一個灰色的第二色階范圍,用它乘以第四部分,就可以得到兩層底色


然后再加上第三部分的高光,即可得結(jié)果。

最終效果

油漆效果

我這里用了莊懂大佬優(yōu)化的方法,還是分部分來解釋。

第一部分,是alpha部分,這里用一個噪點圖,然后縮放uv后取黑白兩色,營造出這種駁雜的alpha。這里取黑白兩色可以用round節(jié)點,也可以用step節(jié)點,但是round節(jié)點只能四舍五入,而step節(jié)點可以取截取的范圍,從而調(diào)節(jié)駁雜的斑紋的大小。

這里尤其需要注意的一點是,一定要用單色通道而不是RGB通道,否則由于分通道截取結(jié)果不同,會導(dǎo)致結(jié)果有雜色。


第二部分,前面都是熟悉的phong,但是在調(diào)整高光值的地方,連的是一個lerp節(jié)點,這個lerp節(jié)點以alpha為根據(jù),輸出兩個不同的高光值(黑的地方輸出B值,白的地方輸出A值),由此可以調(diào)節(jié)油漆和金屬本身的不同的高光。

第三部分是底色部分,也是熟悉的蘭伯特光照,然后乘以兩個顏色節(jié)點附加不同的顏色,再通過lerp節(jié)點,調(diào)節(jié)油漆和金屬顏色。

最后把光照部分和高光部分相加后輸出,即可得到結(jié)果。
