Version: Unity 6.0 (6000.0)
言語 : 日本語
Use indirect lighting in a custom URP shader
URP リファレンスの ShaderLab Pass タグ

カスタム URP シェーダーでの影の使用

カスタムユニバーサルレンダーパイプライン (URP) シェーダーで影を使用するには、以下のステップに従います。

  1. シェーダーファイルの HLSLPROGRAM 内に #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" を追加します。Core.hlsl ファイルは、Shadows.hlsl ファイルと RealtimeLights.hlsl ファイルをインポートします。
  2. 以下のセクションのいずれかのメソッドを使用します。

シャドウスペースでの位置の取得

これらのメソッドを使用して、位置をシャドウマップの位置に変換します。

方法 構文 説明
GetShadowCoord float4 GetShadowCoord(VertexPositionInputs vertexInputs) 頂点の位置をシャドウスペースに変換します 。VertexPositionInputs 構造体の詳細については、カスタム URP シェーダーの Transform 位置 を参照してください。
TransformWorldToShadowCoord float4 TransformWorldToShadowCoord(float3 positionInWorldSpace) ワールド空間での位置をシャドウスペースに変換します。

影の計算

以下のメソッドは、シャドウマップを使用して影を計算します。これらのメソッドを使用するには、まず以下のステップに従います。

  1. シーン内に ShadowCaster シェーダーパスを持つオブジェクト、例えば Universal Render Pipeline/Lit シェーダーを使用するオブジェクトがあることを確認します。
  2. シェーダーに #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN を追加して、メインライトのシャドウマップにアクセスできるようにします。
  3. シェーダーに #pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS を追加して、追加ライトのシャドウマップにアクセスできるようにします。
方法 構文 説明
GetMainLight Light GetMainLight(float4 shadowCoordinates) 影の座標位置が影になっているかどうかに基づく shadowAttenuation 値で、シーンのメインライトを返します。
ComputeCascadeIndex half ComputeCascadeIndex(float3 positionInWorldSpace) ワールド空間の位置にあるシャドウカスケードのインデックスを返します 。詳細については、シャドウカスケード を参照してください。
MainLightRealtimeShadow half MainLightRealtimeShadow(float4 shadowCoordinates) 座標のメインシャドウマップから影の値を返します。詳細については、シャドウマッピング を参照してください。
AdditionalLightRealtimeShadow half AdditionalLightRealtimeShadow(int lightIndex, float3 positionInWorldSpace) ワールド空間の位置にある追加ライトのシャドウマップから影の値を返します。
GetMainLightShadowFade half GetMainLightShadowFade(float3 positionInWorldSpace) 位置とカメラの間の距離に基づいて、メインライトから影をフェードする量を返します。
GetAdditionalLightShadowFade half GetAdditionalLightShadowFade(float3 positionInWorldSpace) 位置とカメラの間の距離に基づいて、追加ライトから影をフェードする量を返します。
ApplyShadowBias float3 ApplyShadowBias(float3 positionInWorldSpace, float3 normalWS, float3 lightDirection) ワールド空間の位置にシャドウバイアスを追加します。詳細については、影のトラブルシューティング を参照してください。

以下の URP シェーダーは、サーフェスに簡単な影を描画します。

影を生成するには、シーン内に ShadowCaster シェーダーパスを持つオブジェクト、例えば Universal Render Pipeline/Lit シェーダーを使用するオブジェクトがあることを確認します。

Shader "Custom/SimpleShadows"
{
    SubShader
    {

        Tags { "RenderType" = "AlphaTest" "RenderPipeline" = "UniversalPipeline" }

        Pass
        {
            HLSLPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

            struct Attributes
            {
                float4 positionOS  : POSITION;
            };

            struct Varyings
            {
                float4 positionCS  : SV_POSITION;
                float4 shadowCoords : TEXCOORD3;
            };

            Varyings vert(Attributes IN)
            {
                Varyings OUT;

                OUT.positionCS = TransformObjectToHClip(IN.positionOS.xyz);

                // Get the VertexPositionInputs for the vertex position  
                VertexPositionInputs positions = GetVertexPositionInputs(IN.positionOS.xyz);

                // Convert the vertex position to a position on the shadow map
                float4 shadowCoordinates = GetShadowCoord(positions);

                // Pass the shadow coordinates to the fragment shader
                OUT.shadowCoords = shadowCoordinates;

                return OUT;
            }

            half4 frag(Varyings IN) : SV_Target
            {
                // Get the value from the shadow map at the shadow coordinates
                half shadowAmount = MainLightRealtimeShadow(IN.shadowCoords);

                // Set the fragment color to the shadow value
                return shadowAmount;
            }
            
            ENDHLSL
        }
    }
}

追加リソース

Use indirect lighting in a custom URP shader
URP リファレンスの ShaderLab Pass タグ