💡 13. 他のシェーダーでキャラクター影を受け取る方法(更新: 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 コードを手で変更したくない場合にはこちらの方が手軽です。

上の画像は、キャラクター影(本来は ASP Shadow Map からサンプリングされる影)が正しく表示されていない例です。
原因は、キャラクターの下にある Terrain マテリアルが Terrain/Lit Shader を使っており、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 Pass で書き込まれた material ID を使って、キャラクター自身へのセルフシャドウを自動的に除去します。

Screen Space Shadow Color を使うと、影の色と透明度も調整できます。

💡 Screen Space Shadow の利点は、他の Shader を手動で変更する必要がまったくないことです。一方、欠点として、他の PBR マテリアルの影色と完全には一致しません。Screen Space Shadow をシーンに合成する時点では対象マテリアルの surface 情報が得られず、単純なアルファブレンドで重ねているためです。 ただし、スタイライズされたアニメ調のゲームであれば、多くの場合この差は許容範囲です。
Hidden/ASP/ScreenSpaceShadows が Project Settings の Always Included Shaders に含まれていることを確認してください。含まれていないと、Screen Space Shadow 用の Shader がビルドに含まれません。
1.20 以降で、エディタ上で ASP Shadow Map Renderer Feature を一度でも有効にしていれば、この Shader は Always Included Shaders に自動追加されます。

方法2 - 自分の Shader code で ASP Shadow Map を手動サンプリングする → 影色を完全に制御したい、または Shader Code に慣れている方向け
1. シーンで内蔵 Lit Shader を使っており、ASP Shadow Map 由来のキャラクター影を表示したい場合
ASP のキャラクター影は、専用の ASP Shadow Map に個別に描画されます。そのため、他の Shader を使うマテリアルでキャラクター影を表示するには、その Shadow Map をサンプリングする必要があります。
URP の一般的な static シーンでは、通常
Universal Render Pipeline/LitShader が使われます。ASP には、その代替としてASP/UniversalPBRLitが用意されています。
ASP/UniversalPBRLitは内蔵 PBR Shader とほぼ同じです(コードをそのまま複製しています)。唯一の違いは、影の描画時に ASP Shadow Map を追加でサンプリングする点です。 static オブジェクトにもキャラクター影を表示したい場合は、内蔵 Lit Shader をASP/UniversalPBRLitに安心して置き換えられます。
💡 注意してください。ASP は追加の Shadow Map をサンプリングする都合上、現在は Forward Rendering / Forward+ Rendering のプロジェクトでのみ正しく動作します。Deferred Rendering には対応していません。
2. シーンオブジェクトが custom code Shader を使っており、ASP Shadow Map 由来のキャラクター影を表示したい場合
シーンで custom Shader を使っている場合は、以下のコードを追加して 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. Custom Shader Graph Shader で ASP Shadow Map 由来のキャラクター影を受けられますか?
理論上は可能ですが、かなり難しいです。Custom Function Node の中で上記のコードを使えば ASP Shadow Map をサンプリングできます。ただし、Shader Graph では光源の
shadow attenuationを直接制御しにくいため、影の色が正しくなりません。これが、代替としてASP/UniversalPBRLitを用意している理由です。
