一、GrabPass简单例子
Grab Pass技术,可以理解为屏幕截图,也就是将帧缓存抓出来一张贴图,并在当前物体或者后续渲染当中,复用这张帖图的技术。
代码如下:
Shader "TYX/07VFMat"
{
Properties{
_MainTex("Texture",2D)="white"{}
_ScaleUVX("Scale X",Range(0,10))=1
_ScaleUVY("Scale Y",Range(0,10))=1
}
SubShader
{
Tags{ "Queue"="Transparent" }
GrabPass{} //启用GrabPass
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv:TEXCOORD0;
};
struct v2f
{
float2 uv:TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _GrabTexture;
sampler2D _MainTex;
float4 _MainTex_ST;
float _ScaleUVX;
float _ScaleUVY;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv=TRANSFORM_TEX(v.uv,_MainTex);
o.uv.x=sin(o.uv.x*_ScaleUVX);
o.uv.y=sin(o.uv.y*_ScaleUVY);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_GrabTexture,i.uv);
return col;
}
ENDCG
}
}
}
注意
1、代码中sampler2D _GrabTexture 是固定写法,不能改名称,在读取Grab中的图像时会用到。
2、上面的代码如果不加Tags{ “Queue”=“Transparent” },该物体就会无限次地获取帧缓存中的贴图,变成下面的效果
因为当他们都是Geometry绘制的时候,如果你先绘制了该物体,之后又绘制了兔子,帧缓冲里的内容就改变了,那么grab就会再次读取帧缓存的内容再次绘制,这样就会变成下面的套娃效果。
GrabPass 通常用于渲染透明物体,尽管代码里并不包括混合指令,但我们往往仍然需要把物体的渲染队列设置成透明队列(即 “Queue”=“Transparent”)。这样才可以保证当渲染该物体时,所有的不透明物体都已经被绘制在屏幕上,从而获取正确的屏幕图像。
二、GrabPass实现玻璃扭曲效果
可以看出来兔子的顶点发生了扭曲效果
代码:
Shader "TYX/08Glass"
{
Properties
{
_MainTex ("Texture", 2D) = "white"