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
}
}
}