扭曲效果
实现原理
1.通过unity内置pass抓取屏幕。
2.使用噪波贴图控制uv偏移。
3.通过mask贴图来控制扰动区域。
Shader "MyMobile/Distort/Particle_Distort"
{
Properties
{
_MainTex("Base 2D", 2D) = "white"{}
_NoiseTex("NoiseTexture", 2D) = "white" {}
_Frequency("Frequency",range(0,1)) = 0.2
}
SubShader
{
GrabPass
{
"_GrabTempTex"
}
Tags { "RenderType"="Transparent" "Queue"="Transparent" }
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
Lighting Off
Fog {Mode Off}
CGINCLUDE
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform float4 _MainTex_ST;
uniform sampler2D _GrabTempTex;
uniform fixed4 _GrabTempTex_ST;
uniform sampler2D _NoiseTex;
uniform float4 _NoiseTex_ST;
float _Frequency;//uv移动频率
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal : NORMAL;
float4 color :COLOR;
};
struct v2f
{
float4 vertex : SV_POSITION;
float2 uvmain : TEXCOORD0;
float4 uvnoise : TEXCOORD1;
float4 uvgrab : TEXCOORD2;
float4 color : COLOR;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uvgrab = ComputeGrabScreenPos(o.vertex);//将转化到标准裁剪空间(-1,1)区间的顶点转化到(0,1)区间。
o.uvnoise.xy = TRANSFORM_TEX(v.uv,_NoiseTex) + frac(_Time * _Frequency);
o.uvnoise.zw = TRANSFORM_TEX(v.uv,_NoiseTex) - frac(_Time * _Frequency);
o.uvmain = TRANSFORM_TEX( v.uv, _MainTex );
o.color = v.color;
return o;
}
ENDCG
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
fixed4 frag (v2f i) : SV_Target
{
half4 offsetColor1 = tex2D(_NoiseTex, i.uvnoise.xy);
half4 offsetColor2 = tex2D(_NoiseTex, i.uvnoise.zw);
i.uvgrab.x += (offsetColor1.r + offsetColor2.r);
i.uvgrab.y += (offsetColor1.g + offsetColor2.g);
half4 col = tex2Dproj( _GrabTempTex, UNITY_PROJ_COORD(i.uvgrab));
half4 main = tex2D( _MainTex, i.uvmain);
col.a = col.a * main.a * i.color.a;
return col ;
}
ENDCG
}
}
}