着色器实现Swaying效果,如图
属性栏如图
完整代码
Shader "Swaying"
{
Properties
{
_MainTex ("Main Texture", 2D) = "white" {}
_Color("Main Color", Color) = (1,1,1,1)
_Alpha("General Alpha", Range(0,1)) = 1
_GrassSpeed("Speed", Range(0,50)) = 2
_GrassWind("Bend amount", Range(0,50)) = 20
_WaveAmount("Wave Amount", Range(0, 25)) = 7
_WaveSpeed("Wave Speed", Range(0, 25)) = 10
_WaveStrength("Wave Strength", Range(0, 25)) = 7.5
_WaveX("Wave X Axis", Range(0, 1)) = 0
_WaveY("Wave Y Axis", Range(0, 1)) = 0.5
_ClipUvLeft("Clipping Left", Range(0, 1)) = 0
_ClipUvRight("Clipping Right", Range(0, 1)) = 0
_ClipUvUp("Clipping Up", Range(0, 1)) = 0
_ClipUvDown("Clipping Down", Range(0, 1)) = 0
}
SubShader
{
Tags {"Queue" = "Transparent" "RenderType"="Opaque" "IgnoreProjector" = "True" }
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
Cull Off
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
half4 color : COLOR;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
half4 color : COLOR;
};
sampler2D _MainTex;
half4 _MainTex_ST, _MainTex_TexelSize, _Color;
half _Alpha;
float _RandomSeed;
half _GrassSpeed, _GrassWind, _GrassRadialBend;
float _WaveAmount, _WaveSpeed, _WaveStrength, _WaveX, _WaveY;
half _ClipUvLeft, _ClipUvRight, _ClipUvUp, _ClipUvDown;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.color = v.color;
return o;
}
half4 frag (v2f i) : SV_Target
{
float2 uvRect = i.uv;
half2 center = half2(0.5, 0.5);
half windOffset = sin((_Time + _RandomSeed) * _GrassSpeed * 10);
half2 windCenter = half2(0.5, 0.1);
i.uv.x = fmod(abs(lerp(i.uv.x, i.uv.x + (_GrassWind * 0.01 * windOffset), uvRect.y)), 1);
half2 delta = i.uv - windCenter;
half delta2 = dot(delta.xy, delta.xy);
half2 delta_offset = delta2 * windOffset;
i.uv = i.uv + half2(delta.y, -delta.x) * delta_offset * _GrassRadialBend;
float2 uvWave = half2(_WaveX * _MainTex_ST.x, _WaveY * _MainTex_ST.y) - i.uv;
uvWave %= 1;
uvWave.x *= _ScreenParams.x / _ScreenParams.y;
float waveTime = _Time.y + _RandomSeed;
float angWave = (sqrt(dot(uvWave, uvWave)) * _WaveAmount) - ((waveTime * _WaveSpeed));
i.uv = i.uv + uvWave * sin(angWave) * (_WaveStrength / 1000.0);
half2 tiledUv = half2(i.uv.x / _MainTex_ST.x, i.uv.y / _MainTex_ST.y);
clip((1 - _ClipUvUp) - tiledUv.y);
clip(tiledUv.y - _ClipUvDown);
clip((1 - _ClipUvRight) - tiledUv.x);
clip(tiledUv.x - _ClipUvLeft);
half4 col = tex2D(_MainTex, i.uv) * i.color;
half originalAlpha = col.a;
col.a *= _Alpha;
col *= _Color;
return col;
}
ENDCG
}
}
Fallback "Sprites/Default"
}