小編這次要給大家分享的是Unity Shader如何實(shí)現(xiàn)序列幀動(dòng)畫效果,文章內(nèi)容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。
目前創(chuàng)新互聯(lián)已為上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁(yè)空間、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計(jì)、加格達(dá)奇網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
實(shí)現(xiàn)原理
主要的思想是設(shè)置顯示UV紋理的大小,并逐幀修改圖片的UV坐標(biāo)。(可分為以下四步)
1、我們首先把 _Time.y 和速度屬性_Speed 相乘來得到模擬的時(shí)間,并使用CG 的floor 函數(shù)對(duì)結(jié)果值取整來得到整數(shù)時(shí)間time
2、然后,我們使用time 除以_HorizontalAmount 的結(jié)果值的商來作為當(dāng)前對(duì)應(yīng)的行索引,除法結(jié)果的余數(shù)則是列索引。
3、接下來,我們需要使用行列索引值來構(gòu)建真正的采樣坐標(biāo)。由于序列幀圖像包含了許多關(guān)鍵幀圖像, 這意味著采樣坐標(biāo)需要映射到每個(gè)關(guān)鍵幀圖像的坐標(biāo)范圍內(nèi)。我們可以首先把原紋理坐標(biāo)i.uv 按行數(shù)和列數(shù)進(jìn)行等分,得到每個(gè)子圖像的紋理坐標(biāo)范圍。
4、然后, 我們需要使用當(dāng)前的行列數(shù)對(duì)上面的結(jié)果進(jìn)行偏移,得到當(dāng)前子圖像的紋理坐標(biāo)。需要注意的是,對(duì)豎直方向的坐標(biāo)偏移需要使用減法, 這是因?yàn)樵赨nity 中紋理坐標(biāo)豎直方向的順序(從下到上逐漸增大)和序列幀紋理中的順序(播放順序是從上到下〉是相反的。這樣,我們就得到了真正的紋理采樣坐標(biāo)。
Unity Shader實(shí)現(xiàn)序列幀動(dòng)畫的代碼:
Shader "Unlit/Demo-SequenceAnimation" { Properties { _MainTex ("Sequence Frame Image", 2D) = "white" {} // 序列幀動(dòng)畫紋理 _Color("Color Tint", Color) = (1, 1, 1, 1) // 顏色 _HorizontalAmount("Horizontal Amount", float) = 4 // 行數(shù) _VerticalAmount("Vertical Amount", float) = 4 // 列數(shù) _Speed("Speed", Range(1, 100)) = 30 // 播放速度 } SubShader { // 由于序列幀圖像通常包含了透明通道,因此可以被當(dāng)成是一個(gè)半透明對(duì)象。 // 在這里我們使用半透明的“標(biāo)配”來設(shè)置它的SubShader 標(biāo)簽,即把Queue 和RenderType 設(shè)置成Transparent, //把IgnoreProjector 設(shè)置為True Tags { "RenderType"="Transparent" "Queue"="Transparent" "IgnoreProjector"="True"} LOD 100 Pass { Tags{"LightMode"="ForwardBase"} // 由于序列幀圖像通常是透明紋理,我們需要設(shè)置Pass 的相關(guān)狀態(tài),以渲染透明效果 // 在Pass 中,我們使用Blend 命令來開啟并設(shè)置混合模式,同時(shí)關(guān)閉了深度寫入 ZWrite Off Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag #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; fixed4 _Color; float _HorizontalAmount; float _VerticalAmount; float _Speed; v2f vert (appdata v) { v2f o; o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { float time = floor(_Time.y * _Speed); //所經(jīng)過的時(shí)間 float row = floor(time / _HorizontalAmount); // 第幾行圖片 (和行數(shù)不能對(duì)應(yīng)起來) float column = time - row * _HorizontalAmount; // 第幾列圖片 //每次更新的量 // float offserX = 1.0 / _HorizontalAmount; // float offserY = 1.0 / _VerticalAmount; // half2 uv = float2(i.uv.x * offsetX, i.uv.y*offsetY); //將所顯示的圖片縮放至應(yīng)有的大小 (即一個(gè)關(guān)鍵幀圖像的大?。? half2 uv = float2(i.uv.x /_HorizontalAmount, i.uv.y / _VerticalAmount); // 等價(jià)于上面3句 //下面方法雖然不能和序列幀動(dòng)畫一一對(duì)應(yīng),但仍符合序列幀動(dòng)畫的執(zhí)行順序 uv.x += column / _HorizontalAmount; // 更換序列幀 uv.y -= row / _VerticalAmount; //等價(jià)于uv.y += 1.0 - row / _VerticalAmount; // sample the texture fixed4 col = tex2D(_MainTex, uv); col.rgb *= _Color.rgb; // 設(shè)置紋理顏色 return col; } ENDCG } } }
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)站題目:UnityShader如何實(shí)現(xiàn)序列幀動(dòng)畫效果-創(chuàng)新互聯(lián)
當(dāng)前地址:http://vcdvsql.cn/article32/cscepc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、定制網(wǎng)站、網(wǎng)站導(dǎo)航、網(wǎng)站策劃、做網(wǎng)站、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容