GrabPass는 특별한 패스 타입으로, 오브젝트를 텍스처에 드로우할 화면의 콘텐츠를 가져옵니다. 이 텍스처를 이후 패스에 사용하여 고급 이미지 기반 효과를 수행할 수 있습니다.
GrabPass는 서브셰이더 안에 있어야 하며, 다음 두 가지 형태일 수 있습니다.
GrabPass { }
만 사용하면 현재 화면 콘텐츠를 텍스처로 가져옵니다. 추가 패스에서 _GrabTexture
이름별로 텍스처에 액세스할 수 있습니다. 참고: 이 형태의 GrabPass에서는 각 사용 오브젝트에 대해 많은 시간이 소모되는 화면 가져오기 연산을 수행합니다.GrabPass { "TextureName" }
은 화면 콘텐츠를 텍스처로 가져오지만, 주어진 텍스처 이름을 사용하는 첫 오브젝트에 대해 프레임당 한 번만 가져옵니다. 추가 패스에서 텍스처에 주어진 텍스처 이름으로 액세스할 수 있습니다. 씬에 GrabPass를 사용하는 오브젝트가 2개 이상인 경우 이 메서드로 성능을 높일 수 있습니다.또한 GrabPass는 Name 및 Tags 커맨드도 사용할 수 있습니다.
다음은 전에 렌더링된 것의 컬러를 반전하는 비효율적인 방법입니다.
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번 포함됩니다. 첫 번째 패스에서는 렌더링 시에 오브젝트 뒤에 있는 것을 가져오고 두 번째 패스에서는 가져온 것을 적용합니다. 반전 블렌드 모드를 사용하여 동일한 효과를 더 효율적으로 얻을 수 있습니다.