作業(yè)一卡通材質(zhì)個(gè)人實(shí)現(xiàn)思路
最近開始接觸unity shader,個(gè)人做一些萌新學(xué)習(xí)筆記和總結(jié)。
下面是作業(yè)一的總結(jié),有一說(shuō)一雖然自己做的最終效果不是很完美,但是做的過(guò)程還挺好玩的,特別是自己琢磨出描邊效果后,還挺有成就感。

首先是漸變色,根據(jù)第一節(jié)課的映射思路,我直接在ps做了個(gè)漸變的映射圖

但是這樣出來(lái)的結(jié)果會(huì)發(fā)現(xiàn)過(guò)渡太過(guò)硬了

于是我在過(guò)渡區(qū)域加了漸變,得到映射圖2

于是顏色的效果就做好了

然后是描邊的效果,我不知道在main面板可以直接添加描邊,于是自己想了辦法。
首先我想到通過(guò)光的方向和法線方向點(diǎn)乘,可以得到根據(jù)光的方向漸變的取值,即1到-1。然后在0的周圍就是明暗交界線。
那么如果通過(guò)攝像機(jī)方向和法線方向點(diǎn)乘,那么0的周圍就是物體的邊緣了。

?實(shí)際結(jié)果和我想的也差不多,但是我想要物體邊緣的黑更多一些,現(xiàn)在物體邊緣到中心的范圍是0到1,想要邊緣黑更多,那么就要減一些數(shù)值,這里我減上0.25。那么從邊緣到中心的范圍就是-0.25-0.75.

但是我只想要邊緣黑,中間我想要純白,怎么辦呢。其實(shí)這一步我嘗試了挺多東西(比如加減啥東西,或者blend,clamp啥東西),最后思考后試出了比較好的解決辦法,就是乘以一個(gè)數(shù)值,比如我在這里乘以10,那么從邊緣到中間就是-2.5到7.5,我們知道0以下都是黑,1以上都是白,那么黑的范圍就會(huì)限制在很小的邊緣了。

我原本以為這樣直接就做出了邊緣,接下來(lái)就是換顏色的問(wèn)題,怎么把黑邊換成其他顏色的邊,弄了半天我才想起來(lái)lerp節(jié)點(diǎn),用這個(gè)黑白做lerp節(jié)點(diǎn)的alpha值,然后ab換上想要混合的顏色。但是直接加會(huì)發(fā)現(xiàn)一些問(wèn)題,中間的地方過(guò)曝了。

想了一下后明白了,lerp是根據(jù)0-1來(lái)選取混合的,而我輸入的alpha已經(jīng)是-2.5到7.5了,而恰好,這時(shí)候,clamp就用上了,在上面的節(jié)點(diǎn)后面clamp0-1,再拿去當(dāng)alpha,就實(shí)現(xiàn)了一個(gè)不錯(cuò)的效果。

最后這個(gè)和題目的差別應(yīng)該就在于邊緣不夠硬了,但是可以把乘的數(shù)值調(diào)到100。這樣看起來(lái)就差不多了。

但是,我這個(gè)自制的描邊效果和直接添加的描邊效果在猴頭上的表現(xiàn)差距就有些大了,自制的描邊效果描邊不夠均勻且鋸齒感明顯。


這估計(jì)是因?yàn)槊娴姆ㄏ蚝顽R頭到面的方向的點(diǎn)乘在非球物體上不夠均勻的分布在邊緣導(dǎo)致的。就比如說(shuō)一個(gè)正方體,我的描邊是根據(jù)該點(diǎn)的法向與鏡頭方向的垂直程度來(lái)判斷是否是邊緣的,而正方體一個(gè)面上所有的點(diǎn)都是朝一個(gè)方向,而不是僅僅邊緣部位垂直于攝像機(jī)方向。而main的描邊可以精確選擇出視圖上渲染出來(lái)的物體的邊緣

上面正方形的頂上這個(gè)面一半黑一半不黑是因?yàn)?,盡管各個(gè)點(diǎn)的法向相同,但是各個(gè)點(diǎn)到攝像機(jī)的方向是不一樣的,越近的點(diǎn),夾角越小。

注:在blender導(dǎo)出猴頭時(shí),需要勾選“應(yīng)用變換”選項(xiàng),否則描邊會(huì)出錯(cuò)。