티스토리 뷰

Unity/Shader

ShadowCaster & DepthOnly Passes

연홍 2021. 1. 25. 11:02
728x90

ShadowCaster

셰이더가 그림자를 드리우려면 "LightMode"= "ShadowCaster"태그가 있는 패스가 필요합니다. Unlit 셰이더와 Lit 셰이더 모두 이 작업을 수행 할 수 있지만 그림자를 드리우는 동안 UniversalForward 패스에서 처리하지 않는 한 그림자를 받지 않습니다.

 

셰이더에는 "LightMode"= "DepthOnly"태그가 지정된 패스도 포함되어야합니다. 이 패스는 ShadowCaster와 매우 유사하지만 그림자 bias offset이 없습니다. URP에서 DepthOnly 패스가 무엇에 사용되는지 완전히 잘 모르겠습니다. 씬 뷰는 (셰이더 그래프의 씬 뎁스 노드에서 사용되는) 뎁스 텍스처를 렌더링 할 때 이것을 사용하는 것 같지만, 게임 뷰 뎁스 텍스처는 이 패스없이 잘 작동하는 것 같습니다. 하지만 DepthOnly 패스에 의존하는 커스텀렌더기능 (포워드 렌더러 용)과 같은 다른 것들이 있을 수 있습니다.

 

셰이더의 모든 패스와 마찬가지로 셰이더가 SRP Batcher와 호환되도록하려면 동일한 UnityPerMaterial CBUFFER를 공유해야합니다. 이 게시물의 이전 섹션에서는 셰이더의 모든 패스에 자동으로 사용되도록 HLSLINCLUDE 내부에 버퍼를 넣었습니다.

 

Shaderlab 섹션에서 다시 논의한 UsePass를 사용하는 경우는 예외입니다. 다른 셰이더의 그림자 캐스터를 사용할 수는 있지만 UsePass "UniversalRenderPipeline/Lit/ShadowCaster", SRP Batcher 호환성은 해당 셰이더에서 사용되는 CBUFFER가 다를 수 있으므로 손실 될 수 있습니다.

대신 이러한 패스를 직접 정의해야하지만 약간의 해결 방법으로 다음을 수행 할 수 있습니다.

Pass {
    Name "ShadowCaster"
    Tags { "LightMode"="ShadowCaster" }
 
    ZWrite On
    ZTest LEqual
 
    HLSLPROGRAM
    // Required to compile gles 2.0 with standard srp library
    #pragma prefer_hlslcc gles
    #pragma exclude_renderers d3d11_9x gles
    //#pragma target 4.5
 
    // Material Keywords
    #pragma shader_feature _ALPHATEST_ON
    #pragma shader_feature _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
 
    // GPU Instancing
    #pragma multi_compile_instancing
    #pragma multi_compile _ DOTS_INSTANCING_ON
             
    #pragma vertex ShadowPassVertex
    #pragma fragment ShadowPassFragment
     
    #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
}

Unity가 URP 셰이더에 사용하는 ShadowCasterPass를 사용하면 패스를 정의하는 것이 조금 더 쉬워 지지만 _BaseMap, _BaseColor 및 _Cutoff 속성을 사용해야하며 UnityPerMaterial CBUFFER에도 추가해야합니다.

 

그림자 캐스터의 fragment함수는 그림자가 있어야하는 곳에 0을 반환하고 그림자가 없어야하는 픽셀을 버립니다. (참고 : 클리핑은 _ALPHATEST_ON 키워드가 활성화 된 경우에만 발생 함)

 

일반 셰이더 패스도 버텍스 displacement를 수행하는 경우, 이것은 displace된 그림자를 올바르게 투사하도록 ShadowCaster 패스에도 추가해야합니다. 이를 처리하려면 ShadowCasterPass의 내용을 패스에 복사하거나 새 정점 함수를 정의하고 #pragma 정점 ShadowPassVertex를 교체해야합니다. 예 :

#pragma vertex vert
 
...
 
// function copied from ShadowCasterPass and edited slightly.
Varyings vert(Attributes input) {
    Varyings output;
    UNITY_SETUP_INSTANCE_ID(input);
 
    // Example Displacement
    input.positionOS += float4(0, _SinTime.y, 0, 0);
 
    output.uv = TRANSFORM_TEX(input.texcoord, _BaseMap);
    output.positionCS = GetShadowPositionHClip(input);
    return output;
}

DEPTHONLY

몇 가지 사소한 차이를 제외하고 비슷한 방식으로 DepthOnly 패스를 처리 할 수 있습니다.

Pass {
    Name "DepthOnly"
    Tags { "LightMode"="DepthOnly" }
 
    ZWrite On
    ColorMask 0
 
    HLSLPROGRAM
    // Required to compile gles 2.0 with standard srp library
    #pragma prefer_hlslcc gles
    #pragma exclude_renderers d3d11_9x gles
    //#pragma target 4.5
 
    // Material Keywords
    #pragma shader_feature _ALPHATEST_ON
    #pragma shader_feature _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
 
    // GPU Instancing
    #pragma multi_compile_instancing
    #pragma multi_compile _ DOTS_INSTANCING_ON
             
    #pragma vertex DepthOnlyVertex
    #pragma fragment DepthOnlyFragment
             
    #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/DepthOnlyPass.hlsl"
 
    // Again, using this means we also need _BaseMap, _BaseColor and _Cutoff shader properties
    // Also including them in cbuffer, except _BaseMap as it's a texture.
    // 다시 말하지만, 이것을 사용하면 _BaseMap, _BaseColor 및 _Cutoff 셰이더 속성도 필요합니다.
     // 텍스처이므로 _BaseMap을 제외하고 cbuffer에 포함합니다.
 
    ENDHLSL
}

이번에는 Unity의 URP 셰이더에서 제공하는 DepthOnlyPass를 사용합니다. 다시 말하지만, 정점 변위가 필요한 경우 DepthOnlyVertex 함수를 코드에 복사하고 이름을 vert로 변경 한 다음 위의 ShadowCaster 예제와 같이 변위 코드를 추가해야합니다.

'Unity > Shader' 카테고리의 다른 글

Shader Variants  (0) 2021.03.23
Summary of Built-in vs URP differences  (0) 2021.01.25
PBR Lighting  (0) 2021.01.25
Lighting Introduction  (0) 2021.01.22
Keywords & Shader Variants  (0) 2021.01.22
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31