版本:Unity 6 (6000.0)
语言:英语
在自定义 URP 着色器中使用光源
URP 参考中的着色器标签

在自定义 URP 着色器中使用阴影

要在自定义通用渲染管线一系列操作,它们会获取场景的内容并将其显示在屏幕上。Unity 允许您选择预先构建的渲染管线,或自己编写。 更多信息
参见 术语表
(URP) 着色器在 GPU 上运行的程序。 更多信息
参见 术语表
中使用阴影,请按照以下步骤操作

  1. 在着色器文件中的 HLSLPROGRAM 中添加 #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"Core.hlsl 文件会导入 Shadows.hlslRealtimeLights.hlsl 文件。
  2. 使用以下部分中的任何方法。

获取阴影空间中的位置

使用这些方法将位置转换成阴影贴图位置。

方法 语法 说明
GetShadowCoord float4 GetShadowCoord(VertexPositionInputs vertexInputs) 将顶点位置转换成阴影空间。有关 VertexPositionInputs 结构的信息,请参阅 在自定义 URP 着色器中变换位置
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
        }
    }
}

其他资源

在自定义 URP 着色器中使用光源
URP 参考中的着色器标签