GrabPass 是一个命令,它创建一种特殊的 Pass 类型,将帧缓冲区的内容抓取到纹理中。该纹理可以在后续的 Pass 中使用,以实现高级的基于图像的效果。
此命令会显著增加 CPU 和 GPU 帧时间。您通常应该避免使用此命令,除非用于快速原型设计,并尝试通过其他方式实现您的效果。如果您确实使用此命令,请尽可能减少屏幕抓取操作的次数;可以通过减少此命令的使用次数,或者在适用时使用将屏幕抓取到命名纹理的签名来实现。
GrabPass 仅适用于帧缓冲区。您不能使用此命令来抓取其他渲染目标的内容,深度缓冲区一个内存存储,用于保存图像中每个像素的 z 值深度,其中 z 值是每个渲染像素相对于投影平面的深度。 更多信息
参见 术语表,等等。
此内置 渲染管线一系列操作,用于获取场景的内容,并将其显示在屏幕上。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
}
}
}