Version: Unity 6.0 (6000.0)
언어 : 한국어
빌트인 렌더 파이프라인의 주변광 셰이더 예시
빌트인 렌더 파이프라인에서 그림자 셰이더 수신 예시

빌트인 렌더 파이프라인의 그림자 드리우기 셰이더 예시

셰이더는 현재 그림자를 수신하거나 드리울 수 없습니다. 먼저 그림자를 드리우는 것부터 구현하겠습니다

그림자를 드리우려면 셰이더의 해당 서브셰이더 또는 폴백ShadowCaster 패스 유형이 있어야 합니다. ShadowCaster 패스는 오브젝트를 섀도우 맵으로 렌더링하는 데 사용되며 보통은 매우 간단합니다. 버텍스 셰이더는 버텍스 위치만 평가하면 되며, 프래그먼트 셰이더는 거의 아무 작업도 수행하지 않습니다. 섀도우 맵은 단지 뎁스 버퍼이므로 프래그먼트 셰이더를 통해 출력한 컬러도 실제로 중요하지 않습니다.

대부분의 셰이더에 있어 섀도우 캐스터 패스는 거의 똑같을 것이라는 의미입니다(단, 오브젝트에 커스텀 버텍스 셰이더 기반 변형이 있거나 알파 컷아웃/반투명 부분이 있을 경우 제외). 섀도우 캐스터 패스를 가져오는 가장 쉬운 방법은 UsePass 셰이더 커맨드를 사용하는 것입니다.

Pass
{
    // regular lighting pass
}
// pull in shadow caster from VertexLit built-in shader
UsePass "Legacy Shaders/VertexLit/SHADOWCASTER"

그러나 지금은 학습 중이므로 ‘직접’ 동일하게 해 보겠습니다. 짧은 코드의 경우 텍스처화되지 않은 앰비언트만 수행하는 코드로 조명 패스(‘ForwardBase’)를 대체했습니다. 아래에는 오브젝트가 그림자 드리우기를 지원하도록 하는 ‘ShadowCaster’ 패스가 있습니다.

Shader "Lit/Shadow Casting"
{
    SubShader
    {
        // very simple lighting pass, that only does non-textured ambient
        Pass
        {
            Tags {"LightMode"="ForwardBase"}
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            struct v2f
            {
                fixed4 diff : COLOR0;
                float4 vertex : SV_POSITION;
            };
            v2f vert (appdata_base v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                half3 worldNormal = UnityObjectToWorldNormal(v.normal);
                // only evaluate ambient
                o.diff.rgb = ShadeSH9(half4(worldNormal,1));
                o.diff.a = 1;
                return o;
            }
            fixed4 frag (v2f i) : SV_Target
            {
                return i.diff;
            }
            ENDCG
        }

        // shadow caster rendering pass, implemented manually
        // using macros from UnityCG.cginc
        Pass
        {
            Tags {"LightMode"="ShadowCaster"}

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_shadowcaster
            #include "UnityCG.cginc"

            struct v2f { 
                V2F_SHADOW_CASTER;
            };

            v2f vert(appdata_base v)
            {
                v2f o;
                TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)
                return o;
            }

            float4 frag(v2f i) : SV_Target
            {
                SHADOW_CASTER_FRAGMENT(i)
            }
            ENDCG
        }
    }
}

이제 아래쪽에는 일반 빌트인 디퓨즈 셰이더를 사용한 평면이 있어서 섀도우가 동작하는 모습을 볼 수 있습니다(현재 셰이더는 섀도우를 받는 것은 아직 지원하지 않음).

위에서는 #pragma multi_compile_shadowcaster 지시문을 사용했습니다. 이로 인해 이 셰이더는 여러 배리언트로 컴파일되며 이때 각 프리 프로세서 매크로가 각 배리언트에 대해 정의됩니다. 자세한 내용은 여러 셰이더 배리언트 페이지를 참조하십시오. 섀도우맵에 렌더링할 때 점 광원 대 기타 광원 유형의 경우는 조금 다른 셰이더 코드를 필요로 하며, 그렇기 때문에 이 지시문이 필요합니다.

빌트인 렌더 파이프라인의 주변광 셰이더 예시
빌트인 렌더 파이프라인에서 그림자 셰이더 수신 예시