Game Dev/Unity Shader

18. Shadow Casting - 다니엘 릿 쉐이더 프로젝트

Septentrions 2025. 10. 21. 11:47

유니티의 렌더 파이프라인에서는 실시간 Shadow Casting을 약간 다른 방식으로 구현한다.

Shadow Casting은 새로운 쉐이더를 스크래치부터 작성할 필요는 없다.

 

URP에서는 Depth Texture를 렌더링하여 Shadow Caster Pass를 사용한다.

 

 Pass
{
    Name "ShadowCaster"
    Tags
    {
        "LightMode" = "ShadowCaster"
    }

    ZWrite On
    ZTest LEqual

    HLSLPROGRAM

    #pragma vertex ShadowPassVertex
    #pragma fragment ShadowPassFragment

    #pragma multi_compile_instancing

    #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
    #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/CommonMaterial.hlsl"
    #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceInput.hlsl"
    #include "Packages/com.unity.render-pipelines.universal/Shaders/ShadowCasterPass.hlsl"

    ENDHLSL
}

 

(1)

LightMode가 ShadowCaster로 되어있다.

그래픽 파이프라인에서 옳바른 포인트에서 돌아가도록 ShadowCasting Pass를 지정해준 것이다.

 

ZWrite, ZTest는 각각 Depth Buffer 읽기/쓰기 사용 유무를 나타낸 것이다.

 

(2)

#pragma vertex ShadowPassVertex
#pragma fragment ShadowPassFragment

 

둘 다 각각 Shadow 관련 쉐이더이다.

Vertex Shader에서는 오브젝트의 위치를 Screen Space에 맞게 맞춰준다.

Fragment Shader는 Shader Map 으로 렌더링하도록 한다.

 

(3)

#include "Packages/cohttp://m.unity.render-pipelines.universal/Shaders/ShadowCasterPass.hlsl"

 

ShadowCasterPass는 URP Package에서 Shaders에 있다.

위의 Vertex, Fragment 함수를 지원하고 있다.

이 쉐이더를 사용하려면 나머지 include 된 HLSL 파일들을 요구한다.

 

(4)

#pragma multi_compile_instancing

GPU 인스턴싱을 작동할 수 있게 해준다.

 


마치며

원래 Lighting And Shadows, PBR 포스팅과 함께 작성해야 할 내용이지만

분량이 맞지 않아서 따로 포스팅을 뺐다.

어렵지 않은 부분이니 쉬어가는셈 치자