實現(xiàn)波浪滾動效果

(1)波浪的第一種實現(xiàn)方式:滾動頂點。在頂點著色器中巩那,采用正弦(余弦)函數(shù)诡宗,讓頂點按規(guī)律抬高降低,從而我們就看到了對應(yīng)的波浪效果巴比。
\color{red}{缺點:效果取決于頂點數(shù)量,數(shù)量越多礁遵,波浪效果越平滑}
播放滾動采用的是正弦函數(shù)來實現(xiàn)效果轻绞。
公式依據(jù):
y = asin(bx + c)
y表示正弦值,在本示例中表示 頂點坐標(biāo)在y軸上的偏移量
a表示正弦值的幅度佣耐,因為常規(guī)正弦值[-1,1]
x表示參數(shù)政勃,本示例中表示時間
b表示時間流逝速度
c表示x軸上的偏移量,在本示例中表示頂點在x軸上的坐標(biāo)值

shader實現(xiàn)如下:

///
/// 做一個波浪滾動的效果兼砖,依據(jù)公式: y = a*sin(bx + c)
/// y 表示正弦的值(本示例中頂點坐標(biāo)在y軸上的偏移), a可以作為振幅奸远,x在本示例中表示時間,b表示時間流逝速度掖鱼,c表示坐標(biāo)軸上的偏移(也就是本示例中的頂點在x軸上的坐標(biāo))
Shader "Shader/Shader_wave"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        //振幅a
        _Range("Range",float) = 1.0
        //時間流逝速度
        _Speed("Speed",float) = 1.0
    }
    SubShader
    {
        Pass
        {
            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;
            float _Speed;
            float _Range;

            v2f vert (appdata v)
            {
                v2f o;
                //當(dāng)前的時間*流逝速度
                float timer = _Time.y*_Speed;
                //y軸上的偏移值
                float offsety = _Range*sin(timer + v.vertex.x);
                //頂點坐標(biāo)的y實現(xiàn)偏移
                v.vertex.y = v.vertex.y + offsety;
                //模型空間->世界空間->投影空間
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                return col;
            }
            ENDCG
        }
    }
}

image.png

image.png

(2)第二種波浪效果實現(xiàn)方式:滾動UV
采集某個像素的時候然走,按照正弦(余弦)規(guī)律,將UV值按照波動增加戏挡,這樣某個像素點就會規(guī)律的采集原始uv位置前后的像素值芍瑞。
該方案可以實現(xiàn)波紋效果(扔一個小石子到水里,生成一圈一圈的漣漪)
\color{red}{缺點:按照UV采用正余弦函數(shù)去采集像素褐墅。相對來說計算量會大一點拆檬。 但是效果好}
1.首先確定一個中心點,用作波紋的中心妥凳。(默認中心點是(0.5,0.5))
2.按照時間計算波紋的相對偏移量

image.png

從圖上我們可以看出竟贯,某個uv取值,只是取周圍一定范圍之內(nèi)的逝钥。
取uv的時候屑那,原始uv加上一個確定方向的偏移量,是為了生成以確定圓心為中心的漣漪。
波浪想過是如何形成的呢持际?我認為是視覺錯覺沃琅。

Shader "Unlit/Shader_Wave"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Range("Range",float) = 1.0
        _Speed("Speed",float) = 1.0
        //設(shè)定的漣漪中心位置
        _CenterX("CenterX",float) = 0
        _CenterY("CenterY",float) = 0
        //
        _WaveWidth("WaveWidth",float) = 0.5
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag


            #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 _Speed;
            float _Range;
            float _CenterX;
            float _CenterY;
            float _WaveWidth;
            
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            float GenWave(float range, float len, float width, float timer)
            {
                float wave = sin(len*width + timer);
                //將波峰波谷控制在 0 - 1
                //wave = (wave + 1)*0.5f;
                //振幅
                wave = wave * range;
                return wave;
            }
            

            fixed4 frag (v2f i) : SV_Target
            {
                float2 tempuv = i.uv;
                //默認0.5,0.5為中心點蜘欲,可以根據(jù)這個位置做偏移,得到最新的中心點
                float2 center = float2(0.5 + _CenterX, 0.5 + _CenterY);
                //uv與圓心的偏移向量
                float2 pos = float2(center - tempuv);
                //距離圓心的距離
                float len = length(pos);
                float timer = -_Time.y*_Speed;
                //原理:該點的uv益眉,會隨著時間推移,周期性的取 
                float wave = GenWave(_Range, len, _WaveWidth, timer);
                //UV的偏移量姥份,以圓心為中點的郭脂,這樣才能做出一個圓形的波浪
                float2 offsetuv = normalize(pos)*wave;
                //取像素信息:tempuv 是原始的uv位置, offsetuv 是某個時間點該uv對應(yīng)的偏移量
                                fixed4 col = tex2D(_MainTex, tempuv + offsetuv);
                                return col;
            }
            ENDCG
        }
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末澈歉,一起剝皮案震驚了整個濱河市展鸡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌闷祥,老刑警劉巖娱颊,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凯砍,居然都是意外死亡箱硕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進店門悟衩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剧罩,“玉大人,你說我怎么就攤上這事座泳』菸簦” “怎么了?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵挑势,是天一觀的道長镇防。 經(jīng)常有香客問我,道長潮饱,這世上最難降的妖魔是什么来氧? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮香拉,結(jié)果婚禮上啦扬,老公的妹妹穿的比我還像新娘。我一直安慰自己凫碌,他們只是感情好扑毡,可當(dāng)我...
    茶點故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盛险,像睡著了一般瞄摊。 火紅的嫁衣襯著肌膚如雪勋又。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天换帜,我揣著相機與錄音赐写,去河邊找鬼。 笑死膜赃,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的揉忘。 我是一名探鬼主播跳座,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泣矛!你這毒婦竟也來了疲眷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤您朽,失蹤者是張志新(化名)和其女友劉穎狂丝,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哗总,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡几颜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了讯屈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛋哭。...
    茶點故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涮母,靈堂內(nèi)的尸體忽然破棺而出谆趾,到底是詐尸還是另有隱情,我是刑警寧澤叛本,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布沪蓬,位于F島的核電站,受9級特大地震影響来候,放射性物質(zhì)發(fā)生泄漏跷叉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一吠勘、第九天 我趴在偏房一處隱蔽的房頂上張望性芬。 院中可真熱鬧,春花似錦剧防、人聲如沸植锉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俊庇。三九已至狮暑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辉饱,已是汗流浹背搬男。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留彭沼,地道東北人缔逛。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像姓惑,于是被迫代替她去往敵國和親褐奴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,937評論 2 361

推薦閱讀更多精彩內(nèi)容