寫在前面
由於興趣及個人規劃的關係,最近開始學習unity的shader,第一個想做出來的就是TOON(卡通) Shader了。
為了方便日後查詢資料及避免自己忘掉,所以把當初製作TOON Shader時相關的技術紀錄下來,使用的是Unity的外掛Amplify Shader Editor。
先列出製作時的參考資料
Recreating a Zelda-inspired toon shading in Shader Graph
Toon Shader
unity-卡通風格角色製作心得分享(shadergraph)
日式卡通渲染的效果的unity實現
3D日式卡通人物渲染的經驗分享
Toony Colors Pro 2
再來放個最終的效果圖
好了,可以開始進入正題了。
一、什麼是TOON(卡通) Shader?
先來歸納Toon Shader有什麼特色,不外乎有以下幾點:
1.銳利且明確的陰影分界
2.明顯的高光
3.外描邊
|
Toon Shader的特色
其餘的例如邊光(Rim)、頭髮高光、3S、等等的,都是一些額外加分用的效果了。
二、漫反射
漫反射是光線照射在物體表面後向四周反射的現象,用在這裡的話當然指的就是物體的陰影了。
在Unity裡面已經有預設好的光線計算公式,如果沒有特別指定的話,原則是都會去調用內建的光線公式。但內建的公式是用於模擬真實世界的光線的,既然目標是製作出卡通風格的話,那麼內建的公式顯然是不能使用的。
新增一個新的shader,將Light Model換成自定義光線(Custom Lighting),確認右邊輸出框變成Custom Lighting模式。
接著來個基礎的光線公式:燈光方向(Light Dir)與物體法線方向(World Normal)互相點乘(dot)。
該公式基於蘭伯特(Lambert)光照模型加以簡化來的,這邊就不多提了(主要是我自己也搞不懂XD)。
我們的球體已經有影子,不過好像不太對,前面提到卡通Shader要的是明確的陰影,所以接下來進一步把影子銳利化。
這邊的作法有2種。
一是利用step運算式,把本來會隨著光線逐步遞增或遞減的數值加以規範,強制他只能以0或1的數值輸出。
二是利用(Ramp)漸層圖,來告訴Shader當計算出的漫反射數值小的時候使用左邊的顏色,數值大的時候使用右邊的顏色。
漸層圖(Ramp)
這邊我使用了第一種方法,理由純粹是我懶得想要修改陰影還得開PhotoShop。XD
加了step後,陰影區分出來了,但是怎麼黑成這樣呢?
理由很簡單,還記得上面說step會把數值強制規劃成0與1嗎?數值0在顏色表示是全黑色,既然我們把陰影的輸出強制歸0了,那麼影子會變全黑也是很正常的。
所以這時有人想出方法了,將計算出來的數值乘(multiply)0.5再加上(add)0.5,這就是半蘭伯特光照模型(Half Lambert)。
這樣基本上影子的部分就算完成了,接著就是根據自己的需求增加需要的功能。
為了能夠控制球體顏色,我加入了color節點。將step換成了smoothstep,理由是雖然卡通Shader要有明確的光影邊界,但太過銳利的光影也不太好,smoothstep可以將這個邊界給模糊掉。
為了控制陰影顏色,加入了另一個color來控制,並用濾色(Screen)模式覆蓋上去。
這邊應該會注意到上面的Half Lambert的算式被拿掉了,由於我加了顏色上去,因此光影強度也可以用顏色來控制了,這樣原本的算式就不需要了。
這樣整個漫反射的部分就差不多了。
剩下的下一篇再繼續吧.......
(希望我寫得完......)
|
留言
張貼留言