Unity Shader 2D水流效果

水流的模擬主要運用了頂點變換和紋理動畫的結合;app

頂點變換中,利用正弦函數模擬河流的大體形態,例如波長,振幅等。函數

紋理動畫中,將紋理座標朝某一方向持續滾動以造成流動的效果。動畫

腳本以下:spa

 1 Shader "MyUnlit/ScrollWater"
 2 {
 3     Properties
 4     {
 5         _MainTex ("Texture", 2D) = "white" {}
 6         _Color("Color Tint",color)=(1,1,1,1)
 7         //控制水流波動的幅度,也就是三角函數中的振幅(值域範圍)
 8         _Magnitude("Distortion Magnitude",float)=0.3
 9         //控制週期的長度,值越大,週期越短,頻率越高
10         _InvWaveLength("Distortion Inserve Wave Length",float)=1
11         //流動速度,用於紋理變換
12         _Speed("Speed",float)=0.1
13     }
14     SubShader
15     {
16         //頂點動畫須要禁用合P處理
17         Tags {"Queue"="Transparent" "RenderType"="Transparent" "IgnoreProjector"="true" "DisableBatching"="True"}
18 
19         Pass
20         {
21             //透明度混合:關閉深度寫入+設置混合狀態+禁用剔除(雙面渲染)
22             Tags{"lightmode"="forwardbase"}
23             ZWrite off
24             Blend SrcAlpha OneMinusSrcAlpha
25             Cull off
26 
27             CGPROGRAM
28             #pragma vertex vert
29             #pragma fragment frag
30             #pragma multi_compile_fog
31 
32             #include "UnityCG.cginc"
33             struct appdata
34             {
35                 float4 vertex : POSITION;
36                 float2 uv : TEXCOORD0;
37             };
38 
39             struct v2f
40             {
41                 float2 uv : TEXCOORD0;
42                 UNITY_FOG_COORDS(1)
43                 float4 vertex : SV_POSITION;
44             };
45 
46             sampler2D _MainTex;
47             float4 _MainTex_ST;
48             fixed4 _Color;
49             float _Magnitude;
50             float _InvWaveLength;
51             float _Speed;
52 
53             v2f vert (appdata v)
54             {
55                 v2f o;
56                 float4 offset;
57                 //這裏的方向能夠本身選擇,這裏選擇偏移x方向,其餘方向的偏移保持不變
58                 offset.yzw = float3(0, 0, 0);
59                 //利用正弦函數模擬河流總體的形狀,最後乘以振幅
60                 offset.x = sin((v.vertex.x + v.vertex.y + v.vertex.z)*_InvWaveLength)*_Magnitude;
61                 o.vertex = UnityObjectToClipPos(v.vertex+offset);
62                 //對uv進行某一方向的滾動以模擬水流,這裏選擇v向
63                 o.uv = TRANSFORM_TEX(v.uv, _MainTex);
64                 o.uv += float2(0.0, _Time.y*_Speed);
65 
66                 UNITY_TRANSFER_FOG(o,o.vertex);
67                 return o;
68             }
69 
70             fixed4 frag (v2f i) : SV_Target
71             {
72                 fixed4 col = tex2D(_MainTex, i.uv);
73                 col.rgb *= _Color.rgb;
74                 UNITY_APPLY_FOG(i.fogCoord, col);
75                 return col;
76             }
77             ENDCG
78         }
79     }
80     FallBack "Transparent/VertexLit"
81 }

P.S.須要把紋理的導入設置改成Repeat(重複)code

效果以下:htm

相關文章
相關標籤/搜索