Version: 2022.3
언어: 한국어
ShaderLab 커맨드: UsePass
ShaderLab 커맨드: ZClip

ShaderLab 커맨드: GrabPass

GrabPass는 프레임 버퍼의 콘텐츠를 텍스처로 가져오는 특별한 패스 타입을 만드는 커맨드입니다. 이 텍스처를 이후 패스에 사용하여 고급 이미지 기반 효과를 수행할 수 있습니다.

이 커맨드는 CPU 프레임 시간과 GPU 프레임 시간 모두를 상당히 늘릴 수 있습니다. 일반적으로 이 커맨드는 빠른 프로토타이핑의 목적 외에는 사용하지 말아야 하며, 다른 방법으로 효과를 얻도록 해야 합니다. 이 커맨드를 사용하는 경우, 이 커맨드 사용 자체를 줄이거나 해당하는 경우 이름이 지정된 텍스처로 화면을 가져오는 서명을 사용하여 화면 가져오기 작업의 횟수를 최대한 줄이십시오.

렌더 파이프라인 호환성

기능 이름 빌트인 렌더 파이프라인 유니버설 렌더 파이프라인(URP) 고해상도 렌더 파이프라인(HDRP) 커스텀 SRP
GrabPass 지원 지원 안 함 지원 안 함 지원 안 함

사용법

서브셰이더 블록에서 이 커맨드를 사용하십시오.

GrabPass는 프레임 버퍼에서만 작동합니다. 다른 렌더 타겟의 콘텐츠나 뎁스 버퍼 등을 가져오는 데 이 커맨드를 사용할 수는 없습니다.

서로 다른 두 서명은 기능과 성능에 미치는 영향도 다릅니다. 이름이 지정된 텍스처를 사용하면 화면 가져오기 작업을 상당히 줄일 수 있으며, 이를 통해 많은 리소스를 소모하는 이 커맨드의 영향도 줄일 수 있습니다.

서명 기능
GrabPass { } 같은 서브셰이더의 이후 패스에서 사용할 수 있는 텍스처로 프레임 버퍼 콘텐츠를 가져옵니다.

_GrabTexture라는 이름을 사용하는 텍스처를 참조합니다.

이 서명을 사용하면 Unity가 이 커맨드를 포함하는 배치를 렌더링할 때마다 화면을 가져옵니다. 즉, Unity는 프레임당 여러 번(배치당 1번씩) 화면을 가져올 수 있습니다.
GrabPass { "ExampleTextureName" } 여러 서브셰이더에 걸쳐 같은 프레임의 이후 패스에서 액세스할 수 있는 텍스처로 프레임 버퍼 콘텐츠를 가져옵니다.

특정한 이름을 사용하는 텍스처를 참조합니다.

이 서명을 사용하면 Unity가 이 커맨드와 특정 텍스처 이름을 포함하는 배치를 프레임에서 최초로 렌더링할 때 화면을 가져옵니다.

예제

빌트인 렌더 파이프라인에 대한 이 예제는 GrabPass를 사용하여 렌더 타겟의 컬러를 반전하는 방법을 나타냅니다. 이 방법은 이 효과를 얻는 효율적인 방법이 아니며, GrabPass 사용을 시연할 목적입니다. 반전 블렌드 모드를 사용하면 같은 효과를 더 효율적으로 구현할 수 있습니다.

Shader "GrabPassInvert"
{
    SubShader
    {
        // Draw 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
        }

    }
}

ShaderLab 커맨드: UsePass
ShaderLab 커맨드: ZClip