Anime Shading Plus
Show / Hide Table of Contents

🦇 6.人物陰影設定 - ASP的陰影方案 (更新1.3 - 2025/11)

在設定陰影之前,這一頁會先說明為什麼ASP會至少使用額外的一張shadow map或者使用立方體來剔除自陰影。

💡 從ASP 1.3版之後,新增了設定立方體剔除自陰影的方式,相較於使用額外的shadow map,這是一個易於設定,同時節省效能的方法,以下頁面中我會將這兩種方法的設定步驟區分開來
請讓你的專案只選擇其中一種來設定


卡通渲染角色自陰影問題


在一般情況下,使用內建的shadow map時,人物身上的self shadowing的效果並不理想,這是因為shadow map的大小有限的關係 -
同一張shadow map必須能夠包含整個場景,場景上的人物通常只能佔shadow map內非常小的部分 (即使有使用Unity內建的4層Cacaded Shadow Map,仍然不夠)。

Image

上圖中,頭髮與臉部mesh投射出的陰影,就會因為shadow map不夠大而在自身產生不理想的self shadowing。

單單只是將頭髮與臉部mesh的ShadowCaster改成Off可以避免來自臉部與頭髮的自陰影,但地上的人物陰影同時也會缺少臉部與頭髮。

Image

自陰影的解決方法(新) - 立方體(CUBE)剔除法

Image

原理:
在 重力異想世界(PS Vita 版) 的人物陰影算法中,人物並不以「當前像素的世界座標」直接對陰影貼圖進行採樣。
取而代之,系統會在角色外部包覆一個 虛擬的立方體(proxy cube),這個立方體完整包含整個人物模型。
渲染時,系統會 沿著光源方向從立方體表面向外做 ray trace,尋找此虛擬立方體表面與光源之間的第一個交點,並僅使用這個交點來進行陰影貼圖採樣。
如此一來,人物本身位於立方體內部的表面將完全不會參與自陰影計算,因此:
✔ 人物不會產生任何自陰影(self-shadow)

因為陰影採樣位置永遠來自立方體表面,而不是人物自身的表面。
✔ 仍能接收來自外部環境、其他物件的陰影

立方體外部的物體仍會阻擋光線,因此人物仍然會正確顯示「由外部物件投射過來的陰影」。

💡 針對一般遊戲(尤其是鏡頭較遠的第三人稱類型),我推薦使用這一個方法,因為不需要額外消耗效能去渲染額外的character-only shadow map

自陰影的解決方法(舊) - Character-Only Shadow Map

ASP選擇使用一個可以有效解決self shadowing的方法 -
將人物渲染至一張獨立的shadow map中,人物本身只接收來自Unity內建、不包含人物的shadow map陰影,
而一般的場景物件則接收包含人物的shadow map以及內建shadow map - 共兩張shadow map的陰影,
這並不是一個適用於所有類型的方法,但對於追求二次元風的卡通渲染來說已經可以得到足夠有說服力的結果。

Image

人物本身仍然能接收來自Unity內建shadow map的陰影

Image

抑或是選擇性的針對特定材質開啟接收人物陰影,比如說只將腿部的部分設為可接收/人物陰影

Image


螢幕空間深度偏移陰影


雖然使用兩張shadow map可以避免過低解析度的自陰影,但也丟失了人物自身的陰影細節,ASP提供一個額外的pass,
依靠偏移深度buffer製造出類似於賽璐璐動畫中人物臉部與身上出現的陰影。可以藉此補足像是頭髮對臉部的陰影細節。

Image

下一頁,我會示範如何利用CharacterPanel,在Unity編輯器中快速的設定角色的陰影參數。

⏭️ 前往下一頁 🦇 7.人物陰影設定 - 利用ASP Character Panel設定投射與接收陰影。(更新1.3 - 2025/11)

  • Edit this page
In this article
Back to top Generated by DocFX