一个练习-自定义需求
同事在做浪花的shader效果,然后我就再此基础上自己给自己提需求改编了一下,就当练习了。
动画组成部分:天空、波浪、球 。
其中浪花的移动轨迹不想要太规律,还有想要加上点渐变。球就简单的随着浪花的高度变化而变化。
效果图
代码
Shader "Unlit/Lang"
{
Properties
{
_MainTex("Texture", 2D) = "white"{}
_Speed("速度",Range(-10,10))=1
_FuDu("振幅",Range(0,1))=0.2
_PinLv("频率",Range(0,100)) = 10
_Length("高度",Range(0,1))=0.5
_OneColor("天空颜色",Color)=(0,1,1,1)
_TwoColor("浪颜色",Color) = (0,1,1,1)
_ThreeColor("天空颜色2",Color) = (1,1,1,1)
_BallRadius("球的半径",Range(0,1))=1
}
SubShader
{
Tags { "RenderType" = "Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float _Speed;
float _FuDu;
float _Length;
float _PinLv;
float _BallRadius;
fixed4 _OneColor, _TwoColor, _ThreeColor;
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
float GetPosY(float uvx)
{
float siny = sin(_Time.y);
float cosy = lerp(0.2, 0.5, 1 - cos(_Time.y));
return _FuDu * (cosy * siny * 0.4 + 1) * sin(uvx * (10 * cosy * (siny*0.1+1)) + _Time.y * _Speed * _PinLv) + _Length;
}
fixed4 frag(v2f i) : SV_Target
{
float y = GetPosY(i.uv.x);
float v = lerp(1,0, i.uv.y - y) ;
float d = step(i.uv.y, y); //if(i.uv.y>y) d=1 , else d=0
fixed4 col = _TwoColor * d + _OneColor * (1 - d);
float upy= lerp(1,0, i.uv.y-0.5 );
fixed4 skyColor= lerp(_OneColor,_ThreeColor, i.uv.y - 0.5);
col = col * d*v+ skyColor * (1 - d)*upy;
float2 target = float2(0.5, GetPosY(0.5)+ _BallRadius);
float val = clamp(_BallRadius -(distance(i.uv, target)),0,1);
val = smoothstep(0, 0.01, val);
col = col* d* v + skyColor * (1 - d) * upy + val;
return col;
}
ENDCG
}
}
}