GrabPass は、フレームバッファのコンテンツをテクスチャに取り込む特別なタイプのパスを作成するコマンドです。このテクスチャを後続のパスで使用して、画像ベースの高度な効果を実現できます。
このコマンドは、CPU と GPU の両方のフレームタイムを大幅に増加させます。高速なプロトタイピング以外のためにこのコマンドを使用することは避け、他の方法で効果を得るようにしてください。このコマンドを使用する場合は、このコマンドの使用を減らすか、該当する場合は画面を名前付きテクスチャに取り込む署名を使用して、画面の取り込み操作の回数をできる限り減らすようにしてください。
GrabPass はフレームバッファに対してのみ動作します。このコマンドを使って、他のレンダリングターゲットや深度バッファなどのコンテンツを取得することはできません。
このビルトインレンダーパイプラインの例では、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
}
}
}