💡 13.讓其他shader可以接收人物陰影的方式 (更新:2024/10/04 - 1.20版)
💡 在1.20版本之前,要讓使用其他非ASP Shader的材質接收人物陰影(即採樣ASP shadow map)的方式,只能透過手動修改各別shader內的程式碼來達成,詳見本頁第2點。
從1.20版開始,ASP shadow map renderer feature中提供了Screen Space Shadow的選項,這一個功能可以一鍵達成讓人物陰影顯示在其他材質上,且完全避免人物的自陰影,對於無法手動修改shader code的人來說是較為便利的選項。

上圖為一個沒有正確顯示人物陰影(應採樣自ASP Shadow Map)的範例。
原因是人物下方的Terrain材質使用的Shader - Terrain/Lit本身並沒有去採樣ASP Shadow Map,我們可以使用下方的 方法1 或者 方法2 來使人物陰影顯示出來。
方法1 - 用ASP Shadow Map中的Screen Space Shadow功能 →適合不想手動修改場景上其他材質Shader code的使用者

將當前的Universal Renderer Data中內的 - ASP ShadowMap feature下,將Use Screen Space Shadow Pass設為true。
ASP的Screen Space Shadow會在Opaque物件渲染完畢之後,透過深度緩衝重建世界座標,以此世界座標來採樣asp shadow map,同時利用material ID(在此時Material pass也已經渲染完畢)來剔除掉人物自身的自陰影。

透過Screen Space Shadow Color參數也能夠調整陰影的顏色與透明度。

💡 使用screen space shadow的好處是完全不需要手動修改其他shader,但缺點是顏色與跟其他PBR材質的陰影會有差異,原因是渲染screen space shadow到場景上時,並沒有當前其他材質的surface資訊,單純的是使用透明度混和。
不過這對高度風格化的動漫風格遊戲來說大多是可以接受的。
請確保*Hidden/ASP/ScreenSpaceShadows* 有在 ProjectSettings中的Always Included Shaders內. 不然screen space shadow的shader並不會一併打包進專案的執行檔中。
如果你有手動在編輯器中開啟過ASP shadow map renderer feature(1.20版之後),這個shader會自動加入Always Included Shaders的清單內。

方法2 - 手動在自己的Shader code中採樣ASP Shadow Map → 適合想完全控制Shadow顏色、熟悉Shader Code的使用者
1. 場景使用內建Lit Shader,但需要顯示來自ASP Shadow Map的人物陰影
ASP的人物陰影單獨渲染至額外的ASP Shadow Map後,使用其他shader的材質如果要接收人物陰影就必須採樣該shadow map才有辦法顯示人物陰影。
在URP內一般的static場景都會使用URP內建的Universal Render Pipeline/Lit Shader,ASP提供了ASP/UniversalPBRLit這一個修改過後的PBR shader作為替代 -
ASP/UniversalPBRLit與內建PBR是完全一樣的(我直接複製了整份code),唯一的差異是在渲染陰影的時候會去額外採樣ASP Shadow Map。
換句話說,在需要讓Static的物件可以接收並顯示人物陰影的情況時,使用者可以安心的將內建的Lit Shader替換成ASP/UniversalPBRLi。
💡 請注意,ASP為了採樣額外的shadow map,ASP目前只能在前向渲染、前向渲染+的專案中正確運作,ASP並不支援延遲渲染。
2. 場景物件使用custom code shader,需要顯示來自ASP Shadow Map的人物陰影
如果場景使用的是custom shader,可以透過加入以下code來採樣ASP Shadow Map
#include "YourPathToASP/Shaders/ShaderLibrary/ASPShadows.hlsl" //inside your fragment shader { float aspShadowMapAttenuation = SampleASPShadowMap(positionWS); //assuming your shader use GetMainLight() or similar to retrieve urp main light. //now your shader can display both main light shadow map shadow and asp shadow map shadow. mainLight.shadowAttenuation *= SampleASPShadowMap; }3. 可以讓自訂的 Shader Graph Shader 接收來自 ASP Shadow Map 的角色陰影嗎?
理論上來說,可以,但是會很困難,你可以在一個Custom Function Node中直接使用上述的程式碼來採樣ASP shadow map。問題在於,Shader Graph 中沒有簡單的方法去控制光源的shadow attenuation,而這會影響陰影顏色。因此,陰影的顏色會是不正確的。這也是我提供ASP/UniversalPBRLit 作為替代方案的原因。
