卡通渲染Shader By Amplify Shader Editor part.3
五、光顏色、光強度、光衰弱
上一篇我們使用了Lambert光照模型,得到了Toon Shader基礎的影子,同時也提到了這個Shader是有瑕疵存在的。
由於Lambert光照模型只用來計算的方向性,但在一個遊戲場景裡面,光絕對不可能只有方向這個要素。最基本的來說,一般光線同時還具有顏色、強度及衰弱這3個要素。
光顏色跟光強度就不用提了,而光衰弱除了紀錄了點光和投射光的強弱訊息外,還影響了其他物件投射在該物體上影子的有無。
所以為了解決這個問題,我們得再從ASE導入光顏色及光衰弱這2個節點。
在ASE裡,光顏色和光衰弱都包含了光強度的資訊。 |
把這2個節點插入之前的漫反射的區塊內,為了讓畫面單純一點,先把Outline跟Specular拿掉了。
那麼馬上就可以來看看效果如何。
看樣子該有的效果都出現了,那麼就可以把Specular加回去了,但再加回去之前我希望Specular也可以受到投射影子的影響。因此同樣要把光衰弱節點放進去Specular的區塊內。
在Specular裡面我沒有把插入光顏色的節點,是因為我認為高光不需要受到環境光的影響,當然如果認為有其必要性,只要在最後乘上光顏色的節點就好了。
到這裡為止,其實已經非常符合一般Toon Shader的使用需求了,只要加上邊光等等的效果其實就有模有樣了。如果我們還想再更進一步呢?例如場景裡還有除了定向光(Directional Light)以外的其他光源呢?
我們先來看一下,目前的節點碰上了點光源(Point Light)會發生什麼事。
為什麼會這樣子?主要原因有2個:
1.
在上面的節點中我們將光衰弱接在Lambert之後,smoothstep之前,step節點會把我們設定的數值為基準將數據只區分成0與1來輸出,所以就算光衰弱節點帶出了其他的訊息,經過step後也沒有意義了。
那為什麼上面要這麼接呢?因為上面的案例中,我們只用到了定向光(Directional Light),定向光不會衰減,永遠只有固定的強度,我們用了光衰弱只為了偵測該物體有沒有受到其他投射物的影子所影響,有影響就是0沒影響就是1,無論有沒有經過step點都一樣。所以光衰弱無論接在step前或step後都不會有任何影響。
但一旦出現其他光源就會發生問題了。
2.
為了讓影子不要太暗同時還可以控制顏色,我加了一個顏色節點去控制它,但這樣子同時也會影響到光衰弱偵測點光源(Point Light)的數值。
既然知道問題了,所以就先把有問題的地方先排除。把光衰弱接到smoothstep之後,將控制影子顏色的節點拿掉。
這樣點光源(Point Light)終於出現符合我們需求的效果了。
那麼如何在保留點光源(Point Light)效果下,之前的效果也照舊呢?
影子太暗的部分應該可以靠Half Lambert光照模型解決,顏色應該也可以在算完光衰後再放入,不過以上我都沒有試過,因為我採用了另一種作法。
修改原本的節點或許固然可以解決問題,但我希望可以在不動到光源設定的情況下手動調整點光源(Point Light)範圍及強度,而且不會影響到原本影子。
所以我把整段節點群組複製出來並刪掉裡面的顏色控制,因為我認為點光源完全受到光本身的顏色影響就好,並將複製出來的全組改名成other light,原始的群組回復到之前的樣子並改名main light。
最後就是要把他們組合在一起了。
這邊比較麻煩的問題在於,它們沒辦法使用單純的加法(add)或乘法(multiply)來組合在一起。
使用加法或乘法時的樣子
因為這2個群組對物體的影響是全面的,單純使用加乘法沒辦法過濾我不要的部分。像是other light裡面我只需要被點光影響到部分,其他的部分都是我不需要的。
因此我最後使用了World Space Light Pos和Compare這2個節點來處理這個問題。
World Space Light Pos跟我們用來算Lambert光照模型所用的World Space Light Dir其實是很像的東西,但他多了一個Type的輸出,它會辨認物體所受到的光的種類,如果是定向光(Directional Light)便會輸出數值0,如果是其他光源便會輸出數值1。
Compare則是單純的比較節點而已,符合條件輸出true,反之則輸出false。
所以運作的原理就是當照射到定向光時,條件符合於是輸出main light群組,當有其他光源時接觸的時候,接觸的部分會違反條件,於是輸出other light群組。
到這邊,我們終於把所有的光線要素放進Shader裡了,而整個Toon Shader比較複雜的部分其實也就到這邊為止了。
下一篇將會開始介紹可以讓Shader額外加分的效果,例如邊光、自發光、頭髮高光、3S等等的。
>>>>>>>>>>to be continued
留言
張貼留言