ShaderLab: GrabPass
原文链接:https://docs.unity3d.com/Manual/SL-GrabPass.html
GrabPass是一个特殊的pass类型,它可以抓取屏幕上显示的内容然后将这个对象绘制到一个纹理中。此纹理可用于后面的pass中以实现更进一步的图像效果。
语法
GrabPass在subshader内部,他有两种存在形式:
·只通过GrabPass{}抓取屏幕内容到一张纹理上。这个纹理可以在后面的pass中通过“_GrabTexture”这个名字访问到。请注意,这种形式的GrabPass会为每个使用它的对象进行一次耗时的屏幕抓取工作。
·GrabPass{"TextureName"}抓取当前的屏幕内容到一张纹理中,但是每帧只会为使用给定纹理名字的的第一个对象执行一次。这个纹理可以在后面的pass中通过给定的名字访问到。当你在场景中有多个对象使用GrabPass时,这是一个更有效率的方法。
另外,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
}
}
}
这个shader有两个pass,第一个pass抓取渲染时在对象后面要显示的内容,第二个执行颜色反转。请注意同样的效果可以通过使用一个反转融合模式更有效率的实现。