Version: 2019.4
언어: 한국어
ShaderLab: UsePass
ShaderLab: 서브셰이더 태그

ShaderLab: GrabPass

GrabPass는 특별한 패스 타입으로, 오브젝트를 텍스처에 드로우할 화면의 콘텐츠를 가져옵니다. 이 텍스처를 이후 패스에 사용하여 고급 이미지 기반 효과를 수행할 수 있습니다.

구문

GrabPass는 서브셰이더 안에 있어야 하며, 다음 두 가지 형태일 수 있습니다.

  • GrabPass { }만 사용하면 현재 화면 콘텐츠를 텍스처로 가져옵니다. 추가 패스에서 _GrabTexture 이름별로 텍스처에 액세스할 수 있습니다. 참고: 이 형태의 GrabPass에서는 각 사용 오브젝트에 대해 많은 시간이 소모되는 화면 가져오기 연산을 수행합니다.
  • GrabPass { "TextureName" }은 화면 콘텐츠를 텍스처로 가져오지만, 주어진 텍스처 이름을 사용하는 첫 오브젝트에 대해 프레임당 한 번만 가져옵니다. 추가 패스에서 텍스처에 주어진 텍스처 이름으로 액세스할 수 있습니다. 씬에 GrabPass를 사용하는 오브젝트가 2개 이상인 경우 이 메서드로 성능을 높일 수 있습니다.

또한 GrabPass는 NameTags 커맨드도 사용할 수 있습니다.

예제

다음은 전에 렌더링된 것의 컬러를 반전하는 비효율적인 방법입니다.

Shader "GrabPassInvert"
{
    SubShader
    {
        // Draw ourselves after all opaque geometry
        Tags { "Queue" = "Transparent" }

        // Grab the screen behind the object into _BackgroundTexture
        GrabPass
        {
            "_BackgroundTexture"
        }

        // Render the object with the texture generated above, and invert the colors
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct v2f
            {
                float4 grabPos : TEXCOORD0;
                float4 pos : SV_POSITION;
            };

            v2f vert(appdata_base v) {
                v2f o;
                // use UnityObjectToClipPos from UnityCG.cginc to calculate 
                // the clip-space of the vertex
                o.pos = UnityObjectToClipPos(v.vertex);
                // use ComputeGrabScreenPos function from UnityCG.cginc
                // to get the correct texture coordinate
                o.grabPos = ComputeGrabScreenPos(o.pos);
                return o;
            }

            sampler2D _BackgroundTexture;

            half4 frag(v2f i) : SV_Target
            {
                half4 bgcolor = tex2Dproj(_BackgroundTexture, i.grabPos);
                return 1 - bgcolor;
            }
            ENDCG
        }

    }
}

셰이더에는 패스가 2번 포함됩니다. 첫 번째 패스에서는 렌더링 시에 오브젝트 뒤에 있는 것을 가져오고 두 번째 패스에서는 가져온 것을 적용합니다. 반전 블렌드 모드를 사용하여 동일한 효과를 더 효율적으로 얻을 수 있습니다.

참고 항목

ShaderLab: UsePass
ShaderLab: 서브셰이더 태그