Version: Unity 6.0 (6000.0)
언어 : 한국어
Use indirect lighting in a custom URP shader
URP의 ShaderLab 패스 태그 레퍼런스

커스텀 URP 셰이더에서 그림자 사용

커스텀 URP(유니버설 렌더 파이프라인) 셰이더에서 그림자를 사용하려면 다음 과정을 따르십시오.

  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
        }
    }
}

추가 리소스

Use indirect lighting in a custom URP shader
URP의 ShaderLab 패스 태그 레퍼런스
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961