Files
2025-01-25 04:38:09 +08:00

131 lines
3.7 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//空气波特效
Shader "Ares/SpecialEffect/AirWaves" {
Properties {
_MainTex ("MainTex", 2D) = "white" {} // 波形图
_NoiseTex ("NoiseTex", 2D) = "white" {} // 紊乱图
_Strength ("Strength", range (0,0.5)) = 0.2 // 波形叠加强度
}
Category {
Tags { "Queue"="Transparent+1" "RenderType"="Transparent" }
Blend SrcAlpha OneMinusSrcAlpha,Zero OneMinusSrcAlpha
Cull Off
Lighting Off
ZWrite Off
CGINCLUDE
#include "UnityCG.cginc"
struct appdata_t {
float4 vertex : POSITION;
float2 texcoord: TEXCOORD0;
};
struct v2f {
float4 pos : SV_POSITION;
float4 uvgrab : TEXCOORD0;
float2 uvmain : TEXCOORD1;
};
uniform sampler2D _MainTex;
uniform sampler2D _NoiseTex;
uniform float _Strength;
v2f vert (appdata_t v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uvgrab = ComputeGrabScreenPos(o.pos);
o.uvmain = v.texcoord.xy;
return o;
}
ENDCG
SubShader {
//这个SubShader使用GrabPass来进行实现,不过据说在移动平台下效率不高,并且也是在iphone5c下可能会崩溃,
//这里的LOD = 210,那么这就需要设置全局Shader的LOD在小于210,才会选择这个SubShader
LOD 210
GrabPass { //抓取屏幕,得到当前屏幕的纹理_GrabTexture
Name "BASE"
Tags { "LightMode" = "Always" }
}
Pass {
Name "BASE"
Tags { "LightMode" = "Always" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
sampler2D _GrabTexture; //全屏幕纹理的样本对象由GrabPass赋值
half4 frag( v2f i ) : COLOR
{
half4 noiseColor = tex2D(_NoiseTex, i.uvmain );
float datx = noiseColor.r * _Strength;
float daty = noiseColor.g * _Strength;
i.uvgrab.x += datx;
i.uvgrab.y += daty;
// 但是上面给x,y叠加了运动的rg值所以就形成透明絮乱图运动的效果
half4 texcolor = tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(i.uvgrab));
//float2 uv = i.uvgrab/i.uvgrab.w;
//half4 texcolor = tex2D(_GrabTexture, uv);
texcolor.a = noiseColor.b * step(0.001,(1-(texcolor.r + texcolor.g +texcolor.b)/3));
return texcolor ;
}
ENDCG
}//end pass
}//end subshader
SubShader {
//这个SubShader使用Rendertexture来进行实现,其中_MainTex,用于保存Rendertextrue信息
//这里的LOD = 200,那么这就需要设置Shader的LOD在小于200,大于200才会选择这个SubShader
LOD 200
Pass {
Name "BASE"
Tags { "LightMode" = "Always" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
fixed4 frag( v2f i ) : COLOR
{
half4 noiseColor = tex2D(_NoiseTex, i.uvmain );
float datx = noiseColor.r * _Strength;
float daty = noiseColor.g * _Strength;
i.uvgrab.x += datx;
i.uvgrab.y += daty;
// 但是上面给x,y叠加了运动的rg值所以就形成透明絮乱图运动的效果
//half4 texcolor = tex2Dproj(_MainTex, UNITY_PROJ_COORD(i.uvgrab));
float2 uv = i.uvgrab/i.uvgrab.w;
#if UNITY_UV_STARTS_AT_TOP
uv.y = 1-uv.y;
#endif
fixed4 texcolor = tex2D(_MainTex, uv);
// 后面的Step用来判断当RenderTexture不赋值的情况
texcolor.a = noiseColor.b * step(0.001,(1-(texcolor.r + texcolor.g +texcolor.b)/3));
return texcolor ;
}
ENDCG
}
}
// 用于老式显卡
SubShader {
//LOD 100
Pass {
//Name "ONLYWRITEDEPTH"
//ZTest LEqual
//ZWrite On
ColorMask 0
}
}
}
}