カスタムユニバーサルレンダーパイプライン (URP) シェーダーで影を使用するには、以下のステップに従います。
HLSLPROGRAM 内に #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" を追加します。Core.hlsl ファイルは、Shadows.hlsl ファイルと RealtimeLights.hlsl ファイルをインポートします。これらのメソッドを使用して、位置をシャドウマップの位置に変換します。
| 方法 | 構文 | 説明 |
|---|---|---|
GetShadowCoord |
float4 GetShadowCoord(VertexPositionInputs vertexInputs) |
頂点の位置をシャドウスペースに変換します 。VertexPositionInputs 構造体の詳細については、カスタム URP シェーダーの Transform 位置 を参照してください。 |
TransformWorldToShadowCoord |
float4 TransformWorldToShadowCoord(float3 positionInWorldSpace) |
ワールド空間での位置をシャドウスペースに変換します。 |
以下のメソッドは、シャドウマップを使用して影を計算します。これらのメソッドを使用するには、まず以下のステップに従います。
ShadowCaster シェーダーパスを持つオブジェクト、例えば Universal Render Pipeline/Lit シェーダーを使用するオブジェクトがあることを確認します。#pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN を追加して、メインライトのシャドウマップにアクセスできるようにします。#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
}
}
}