GrabPass は特別のパスタイプで、描画されるときの画面のコンテンツを、テクスチャ内に掴みとります。このテクスチャは後続プロセスで高度な画像ベースのエフェクトに使用できます。
GrabPass は サブシェーダー の中にあります。二つの形式のいずれかをとります。
GrabPass { }
と指定し、単に現在の画面コンテンツをテクスチャ内に掴みとります。このテクスチャは後続のパスで _GrabTexture
の名でアクセスすることができます。注意:この形式の Grap Pass は時間がかかる画面の掴みとり処理を使用する各オブジェクトごとに行います。GrabPass { "TextureName" }
により現在の画面コンテンツをテクスチャ内に掴みとりますが、フレームごとに 1度だけ、指定のテクスチャ名を使用する最初のオブジェクト分にのみ、実施します。テクスチャは後続のパスで指定のテクスチャ名でアクセスすることができます。シーンで Grab Pass を使用するオブジェクトが複数ある場合に効率的な方法です。さらに、GrabPass は Name や Tags コマンドを使用することができます。
次の例は、前にレンダリングされたカラーを反転する高価な方法です。
Shader "GrabPassInvert"
{
SubShader
{
// すべての不透明のジオメトリの後に、自身を描画します
Tags { "Queue" = "Transparent" }
// オブジェクトの後ろの画面を _BackgroundTexture 内に取得します
GrabPass
{
"_BackgroundTexture"
}
// オブジェクトを上で生成したテクスチャと一緒にレンダリングし、カラーを反転します
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;
// UnityCG.cginc の UnityObjectToClipPos を使って
// 頂点のクリップスペースを計算します
o.pos = UnityObjectToClipPos(v.vertex);
// UnityCG.cginc の ComputeGrabScreenPos を使って
// 正しいテクスチャ座標を取得します
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つのパスがあります。最初のパスはレンダリングのときにオブジェクトにあるすべてを掴みとり、次にをそれを 2つめのパスで適用します。当然、同じエフェクトはより安価に反転ブレンドモード を使用して得ることができます。