Unity Shader頂點(diǎn)動(dòng)畫(huà)

  • 今天我們使用shader來(lái)實(shí)現(xiàn)一個(gè)這樣的動(dòng)畫(huà)


    SinAnim.gif
  • 先說(shuō)下思路,如下圖寬是X軸,高是Z軸。我們以X軸作為sin() 函數(shù)的參數(shù),隨著X的變大,即可出現(xiàn)曲線。
    然后Z再加上這個(gè)值,這樣就能在Z上看出曲線。 即 z = z + sin(x);
    接著我們?cè)僭趕in()里加上time的變化,既可出現(xiàn)動(dòng)畫(huà)。

坐標(biāo)軸.png
  • 準(zhǔn)備工作,創(chuàng)建一個(gè)普通Plane面片,然后創(chuàng)建一個(gè)Unilt Shader,在新創(chuàng)建出來(lái)的shader上直接右鍵,創(chuàng)建一個(gè)材質(zhì)球(材質(zhì)球會(huì)自動(dòng)使用這個(gè)Shader),接著把材質(zhì)球丟給這個(gè)Plane。這樣準(zhǔn)備工作就完成了。

  • 接下來(lái)增加下參數(shù)

 Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Speed("Speed",float) = 1 //控制速度
        _XScale("XScale",float) = 1 // 控制波的寬度
        _Amplitude("_Amplitude",float) = 1 //控制幅度       
    }
  • 修改頂點(diǎn)函數(shù)
  v2f vert (appdata v)
            {
                v2f o;
                //核心代碼
                v.vertex.z = v.vertex.z + _Amplitude * sin(v.vertex.x * _XScale + _Time.y * _Speed);
                
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);               
                return o;
            }
  • 這樣就大功告成了
    可以看到核心代碼和思路是一樣的,只是加了幾個(gè)參數(shù)增加調(diào)控度。
    這里_Speed主要控制動(dòng)畫(huà)速度。 _Amplitude 主要控制動(dòng)畫(huà)的幅度。 XScale控制一個(gè)波的寬度。
  • 最后貼下全部代碼
Shader "Unlit/VertexAnim"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Speed("Speed",float) = 1 //控制速度
        _XScale("XScale",float) = 1 //控制波的寬度
        _Amplitude("_Amplitude",float) = 1 //控制幅度       
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _XScale;
            float _Speed;
            float _Amplitude;
            
            v2f vert (appdata v)
            {
                v2f o;
                
                v.vertex.z = v.vertex.z + _Amplitude * sin(v.vertex.x * _XScale + _Time.y * _Speed);
                
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);               
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }
}

  • 注意點(diǎn)
    如果你的XScale按默認(rèn)的1.那么你可能會(huì)得到像下圖這樣不太平滑的波


    不平滑.png

    這是因?yàn)镻lane的頂點(diǎn)相聚得比較遠(yuǎn)。并不是連續(xù)的,所以就會(huì)出現(xiàn)不平滑??梢郧袚Q到Wireframe視角,如下圖,可以看到頂點(diǎn)離得還是蠻遠(yuǎn)的。


    Wireframe.png

    這時(shí)候XScale參數(shù)就發(fā)揮作用了,把XScale調(diào)小到0.5。那么相當(dāng)于頂點(diǎn)就離得更密集了,也就越平滑了!
  • OK,就這樣了!
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容