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

<aside> 💡

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

</aside>


卡通渲染角色自陰影問題


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

Untitled

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

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

Untitled

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

image.png

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

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

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

<aside> 💡

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

</aside>

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