UnityShader 序列幀動畫效果


實現原理:主要思想是設置顯示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 }

 

序列幀圖像:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM