實現原理:主要思想是設置顯示uv紋理的大小,並逐幀修改圖片的uv坐標。
實現步驟
1、我們首先用_Time.y和速度屬性_Speed相乘得到模擬的時間。
2、然后我們用time除以_HorizontalAmount的結果值作為當前的行索引,除法結果的余數則是列索引。
3、接下來,我們根據行索引和列索引來構建真正的采樣坐標。由於序列幀圖像包含了很多張關鍵幀圖像,這意味着采樣坐標需要映射到關鍵幀圖像的坐標范圍。
4、我們可以把原紋理坐標i.uv按行數和列數進行等分,得到每個子圖像的紋理坐標范圍。
5、映射到對應的行列數后,再對紋理坐標進行偏移。
注意:Unity的紋理坐標豎直方向的順序和序列幀紋理中豎直方向上的順序是相反的。
1 Shader "unilt/SceneRainSplash" { 2 Properties { 3 _MainTex ("Base (RGB)", 2D) = "white" {} //序列幀動畫紋理 4 _Color("Color Tint", Color) = (1, 1, 1, 1) //顏色 5 _HorizontalAmount("Horizontal Amount", float) = 6 // 行數 6 _VerticalAmount("Vertical Amount", float) = 1 // 列數 7 _Speed("Speed", Range(1, 100)) = 7 // 播放速度 8 } 9 10 CGINCLUDE 11 12 #include "UnityCG.cginc" 13 14 sampler2D _MainTex; 15 16 uniform half4 _MainTex_ST; 17 uniform fixed4 _Color; 18 uniform float _HorizontalAmount; 19 uniform float _VerticalAmount; 20 uniform float _Speed; 21 22 struct appdata 23 { 24 float4 vertex : POSITION; //從形似寄存器中讀取頂點坐標 25 float2 uv : TEXCOORD0; //從形似寄存器中讀取uv坐標信息 26 }; 27 28 29 struct v2f 30 { 31 float2 uv : TEXCOORD0; 32 float4 vertex : SV_POSITION; 33 }; 34 35 v2f vert(appdata v) 36 { 37 v2f o; 38 39 //mul(UNITY_MATRIX_MVP,*)' == 'UnityObjectToClipPos(*) 40 //(物體的模型到世界矩陣 * 從世界到攝像機的矩陣 * 投影的矩陣 ) 41 o.vertex = UnityObjectToClipPos(v.vertex); 42 43 //TRANSFORM_TEX,就是將模型頂點的uv和Tiling、offset兩個變量進行計算得出實際顯示用的定點uv 44 o.uv = TRANSFORM_TEX(v.uv, _MainTex); 45 46 return o; 47 } 48 49 fixed4 frag(v2f i) : SV_Target 50 { 51 //所經過的時間,Unity內置變量_Timefloat4 _Time : Time (t/20, t, t*2, t*3) 52 float time = floor(_Time.y * _Speed); 53 //該時間渲染序列幀動畫指定的行列 54 float row = floor(time / _HorizontalAmount); 55 float col = time - row * _HorizontalAmount; 56 57 //將所顯示的單張圖片縮放到應有的大小區域 58 half2 uv = float2(i.uv.x / _HorizontalAmount, i.uv.y / _VerticalAmount); 59 //移動到對應縮放后的區域位置 60 uv.x += col / _HorizontalAmount; 61 uv.y -= row / _VerticalAmount; 62 fixed4 color = tex2D(_MainTex, uv); 63 color.rgb *= _Color.rgb; 64 return color; 65 } 66 67 ENDCG 68 69 SubShader { 70 Tags { "Queue" = "Transparent" } 71 Cull Off 72 ZWrite Off 73 Blend One OneMinusSrcColor 74 75 Pass { 76 77 CGPROGRAM 78 79 #pragma vertex vert 80 #pragma fragment frag 81 #pragma fragmentoption ARB_precision_hint_fastest 82 83 ENDCG 84 85 } 86 87 } 88 FallBack Off 89 }
序列幀圖像:

