Anime Shading Plus
Show / Hide Table of Contents

💡 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 コードを手で変更したくない場合にはこちらの方が手軽です。

Image

上の画像は、キャラクター影(本来は ASP Shadow Map からサンプリングされる影)が正しく表示されていない例です。

原因は、キャラクターの下にある Terrain マテリアルが Terrain/Lit Shader を使っており、ASP Shadow Map をサンプリングしていないためです。キャラクター影を表示するには、以下の 方法1 または 方法2 を参照してください。

方法1 - ASP Shadow Map の Screen Space Shadow 機能を使う → シーン内の他マテリアルの Shader code を手動で変更したくない方向け


Image

現在使用している Universal Renderer Data の ASP ShadowMap Feature で、Use Screen Space Shadow Pass を true にします。

ASP の Screen Space Shadow は、Opaque オブジェクトの描画完了後に深度バッファからワールド座標を再構築し、その座標で ASP Shadow Map をサンプリングします。さらに、Material Pass で書き込まれた material ID を使って、キャラクター自身へのセルフシャドウを自動的に除去します。

Image

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

Image

💡 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 に自動追加されます。

Image

方法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/Lit Shader が使われます。ASP には、その代替として ASP/UniversalPBRLit が用意されています。

ASP/UniversalPBRLit は内蔵 PBR Shader とほぼ同じです(コードをそのまま複製しています)。唯一の違いは、影の描画時に ASP Shadow Map を追加でサンプリングする点です。 static オブジェクトにもキャラクター影を表示したい場合は、内蔵 Lit Shader を ASP/UniversalPBRLit に安心して置き換えられます。

Image

💡 注意してください。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 を用意している理由です。

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