今天做特效,需要一个空气扰动效果,然后为了图方便,直接转了别人的代码,然后稍加修改,
不过转载的链接忘了,代码我经过了略加修改,添加了识别用贴图的透明通道,控制扰动的区域,例如
如果是一个边缘透明的贴图,那么边缘将没有扰动。然后加了用粒子发射,可以用顶点色的阿尔法通道控制扰动强弱:代码效果如下
Shader "FX/Distort"
{
Properties
{
_Noise ("Noise", 2D) = "white" {}
_distortFactorTime("FactorTime",Range(0,5)) = 0.5
_distortFactor("factor",Range(0.04,1)) = 0
}
SubShader
{
Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" }
LOD 100
Cull Off Lighting Off ZWrite Off
GrabPass
{
"_BackgroundTexture"
}
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float4 color:COLOR;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float4 grabPos:TEXCOORD1;
float4 ase_color : COLOR;
};
sampler2D _Noise;
float4 _Noise_ST;
fixed _distortFactorTime;
fixed _distortFactor;
sampler2D _BackgroundTexture;
v2f vert (appdata v)
{
v2f o;
o.ase_color = v.color;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _Noise);
o.grabPos = ComputeGrabScreenPos(o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_Noise, i.uv+=_Time.xy*_distortFactorTime);
i.grabPos.xy +=col.xy*_distortFactor*col.x*col.a*i.ase_color.a;//用贴图的透明通道跟顶点色
half4 bgcolor = tex2Dproj(_BackgroundTexture, i.grabPos);
return bgcolor;
}
ENDCG
}
}
}