![]()
【USparkle專欄】如果你深懷絕技,愛“搞點研究”,樂于分享也博采眾長,我們期待你的加入,讓智慧的火花碰撞交織,讓知識的傳遞生生不息!
這是侑虎科技第1990篇文章,感謝作者Yu-ki016供稿。歡迎轉發分享,未經作者授權請勿轉載。如果您有任何獨到的見解或者發現也歡迎聯系我們,一起探討。(QQ群:793972859)
作者主頁:
https://www.zhihu.com/people/yu-ki-016
一、前言
在動畫或者卡通渲染存在一個很常見的效果,光源的邊界染上一個飽和度較高的顏色,這個效果業內一般稱作半影著色:
![]()
《吹響吧!上低音號》
![]()
《別當歐尼醬了》
![]()
《絕區零》
在HDRP中也有類似的效果:
![]()
Unity里的實現非常簡單,就是拿一個純色來給半影染色:
![]()
除了Unity的這種實現方式,還有一種常見的實現方法是用陰影來采樣Ramp:
![]()
https://zhuanlan.zhihu.com/p/588991753
![]()
https://zhuanlan.zhihu.com/p/688482736
二、實現思路
2.1 純色法
首先在光源組件上添加新的參數:
![]()
![]()
LightComponent.h
接下來正常把這些參數傳給Shader就行,半影顏色的計算直接抄HDRP:
![]()
ToonLightCommon.ush
在光照計算的時候調用ComputeShadowColor:
![]()
DeferredLightingCommon.ush
接下來就能看到效果了:
半影著色_1
效果還挺不錯的,多光影也可以完美兼容:
![]()
不過,有一個尷尬的問題,從上面的視頻效果圖可以發現,主光的半影著色并沒有作用在Toon角色上,這也正常,畢竟Toon角色的主光是在ToonLightPass里單獨計算的。
按照正常的邏輯,我們應該把染過色的Shadow傳給ToonLightPass,但是,這樣需要再用3個通道來存儲陰影,之前的ToonShadow已經滿了,這樣得新創建一張,有些浪費了。
所以我干脆還是把半影的參數傳到ToonLightPass,然后在ToonLightPass自己去計算。
![]()
這樣做還有個好處,如果覺得半影顏色在角色上有點太強了,很容易可以調節強度:
半影著色_2
2.2 Ramp法
同樣的,在光源上添加新的參數:
![]()
傳參方式和以往有所區別,如果把Ramp貼圖放到FLightShaderParameters里的話會報錯:
![]()
SceneManagement.h
所以我把貼圖放到FDeferredLightUniformStruct里,FToonLightUniformParameters也一樣:
![]()
LightRendering.h
![]()
ToonLightPassRendering.h
采樣貼圖的時候由于不同Pass里Buffer的名字不一樣,所以在Shader上添加宏來區分:
![]()
LightRendering.cpp
![]()
ToonLightPassRendering.h
![]()
ToonLightCommon.ush
在材質編輯器里也使用相同的函數來計算半影:
![]()
看看效果:
三、參考和鏈接
3.1 鏈接
本文的修改都上傳GitHub了,對應下圖的提交記錄:
![]()
https://github.com/Yu-ki016/UnrealEngine/tree/YK_Engine
示例工程:
https://github.com/Yu-ki016/YKEngineExampleProject
3.2 參考
[1] Unity URP 8Cascade+PCF/PCSS 陰影+Compute Shader屏幕空間shadowmap+陰影漸變
https://zhuanlan.zhihu.com/p/588991753
[2] 圖形引擎實戰:8級風格化級聯陰影
https://zhuanlan.zhihu.com/p/688482736
文末,再次感謝Yu-ki016的分享, 作者主頁:https://www.zhihu.com/people/yu-ki-016, 如果您有任何獨到的見解或者發現也歡迎聯系我們,一起探討。(QQ群: 793972859 )。
近期精彩回顧
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.