香港6合总彩透码主论坛
 找回密碼
 注冊帳號

掃一掃,訪問微社區

蓬萊仙羽 【Aladdin-Unity3D-Shader編程】之七-波光粼粼的魚

3
回復
1808
查看
打印 上一主題 下一主題
[ 復制鏈接 ]
排名
916
昨日變化

38

主題

524

帖子

2790

積分

Rank: 9Rank: 9Rank: 9

UID
1261
好友
38
蠻牛幣
1926
威望
0
注冊時間
2013-7-31
在線時間
674 小時
最后登錄
2019-10-14

專欄作家認證開發者

馬上注冊,結交更多好友,享用更多功能,讓你輕松玩轉社區。

您需要 登錄 才可以下載或查看,沒有帳號?注冊帳號

x
前言

通過shader實現一個波光粼粼的魚的效果,效果如下圖所示,魚的游動是用的animator,我們也可以用shader通過模型vertex偏移來實現魚兒的游動。

效果

代碼
[AppleScript] 純文本查看 復制代碼
//-----------------------------------------------【Shader說明】----------------------------------------------
//     Shader功能:   波光粼粼的魚
//     使用語言:   Shaderlab
//     開發所用IDE版本:Unity2018.3.6 、Visual Studio 2017
//     2016年9月16日  Created by Aladdin(阿拉丁)
//     更多內容或交流請訪問我的博客:http://blog.csdn.net/s10141303/article/category/6670402
//---------------------------------------------------------------------------------------------------------------------


Shader "阿拉丁Shader編程/2-1.波光粼粼的魚"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
                _SubTex("SubTex",2D) = "white"{}
                _Color("Color",Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags{"RenderType"="Opaque"}
        LOD 100
        Pass 
                {
            CGPROGRAM
            #pragma vertex vert 
            #pragma fragment frag 

                        sampler2D _MainTex;
                        sampler2D _SubTex;
                        float4 _Color;

            struct a2v{
                fixed4 vertex:POSITION;
                fixed2 uv:TEXCOORD0;
            };

            struct v2f{
                fixed4 svPos:SV_POSITION;
                                float2 uv:TEXCOORD0;
            };

            v2f vert(a2v v)
            {
                v2f f;
                f.uv = v.uv;
                f.svPos = UnityObjectToClipPos(v.vertex);
                return f;
            }
            fixed4 frag(v2f f):SV_Target
            {
                float2 offset = float2(0,0);
                                offset.x = _Time.y * 0.3f;
                fixed4 col = tex2D(_MainTex, f.uv);
                                fixed subCol = tex2D(_SubTex, f.uv+ offset);
                                return (subCol + col) * _Color;
            }
            ENDCG
        }
    }
        FallBack  "Specular"
}



通過Shader實現魚兒的游動

如果我們單純用shader來實現魚兒的游動,取消animator動畫也是可以的,效果如下圖

代碼:

[AppleScript] 純文本查看 復制代碼
//-----------------------------------------------【Shader說明】----------------------------------------------
//     Shader功能:   波光粼粼的魚 shader控制魚的游動
//     使用語言:   Shaderlab
//     開發所用IDE版本:Unity2018.3.6 、Visual Studio 2017
//     2019年4月10日  Created by Aladdin(阿拉丁)   
//     更多內容或交流請訪問我的博客:http://blog.csdn.net/s10141303/article/category/6670402
//---------------------------------------------------------------------------------------------------------------------

Shader "阿拉丁Shader編程/2-2.波光粼粼的魚(Shader控制魚的游動)"
{
        Properties 
        {
                _MainTex ("MainTexture", 2D) = "white" {}
                _SubTexture("SubTexture",2D) = "white"{}
                _FlowColor("FlowColor",Color) = (1,0,0,1)
                _Speed("Speed",float) = 0.5
                _Frenquacy("Frenquacy",float) = 1
        }

        SubShader 
        {
                Tags { "RenderType"="Opaque" }
                LOD 100

                Pass
                {
                        CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag
                        #include"UnityCG.cginc"

                        sampler2D _MainTex;
                        float4 _MainTex_ST;

                        sampler2D _SubTexture;

                        float4 _FlowColor;
                        float _Speed;
                        float _Frenquacy;

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

                        struct v2f
                        {
                                float2 uv:TEXCOORD0;
                                float4 vertex:SV_POSITION;
                        };

                        v2f vert(a2v v)
                        {
                                v2f o;
                                float timer = _Time.y * _Speed;
                                float waverX = cos(timer + v.vertex.x)*_Frenquacy;        //魚游動 取代animator
                                v.vertex.x = v.vertex.x + waverX;
                                o.vertex = UnityObjectToClipPos(v.vertex);
                                o.uv = TRANSFORM_TEX(v.uv,_MainTex);  
                                return o;
                        }

                        fixed4 frag(v2f i) : SV_Target
                        {
                                float2 offset = float2(0,0);
                                offset.x = _Time.y * 0.1;
                                offset.y = _Time.y * 0.1;

                                fixed4 subCol = tex2D(_SubTexture,i.uv + offset) * _FlowColor;

                                fixed4 col = tex2D(_MainTex,i.uv);

                                return subCol + col;
                        }
                        ENDCG
                }//end Pass
        }//end SubShader
}//end Shader


對比效果圖


前者是shader實現的動畫效果,后者是unity的動畫,但動畫效果稍微好點,但可能更費性能一點,前者是CPU去實現游動,后者是CPU去實現的游動。


案例Demo

https://github.com/dingxiaowei/AladdinShader






回復

使用道具 舉報

4四處流浪
445/500
排名
16220
昨日變化

2

主題

44

帖子

445

積分

Rank: 4

UID
269716
好友
0
蠻牛幣
1854
威望
0
注冊時間
2018-2-27
在線時間
356 小時
最后登錄
2020-1-22
沙發
2019-5-21 16:15:39 只看該作者
不會寫shader,走流程,先喊一個666
回復 支持 反對

使用道具 舉報

7日久生情
1710/5000
排名
10820
昨日變化

3

主題

1356

帖子

1710

積分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
310426
好友
0
蠻牛幣
2635
威望
0
注冊時間
2019-1-2
在線時間
255 小時
最后登錄
2020-2-17
板凳
2019-5-24 08:51:53 只看該作者
波光粼粼的魚
回復

使用道具 舉報

5熟悉之中
531/1000
排名
14231
昨日變化

0

主題

241

帖子

531

積分

Rank: 5Rank: 5

UID
209003
好友
0
蠻牛幣
819
威望
0
注冊時間
2017-2-28
在線時間
232 小時
最后登錄
2020-2-17
地板
2019-7-23 10:01:16 只看該作者
先喊666666
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊帳號

本版積分規則

香港6合总彩透码主论坛
体彩20选5 14场胜负彩最新预测 内蒙快三规则 上海天天彩 棒球服品牌 广西快乐10分 福彩3d555选号法 二人怎么玩德州扑克 混合过关 甘肃快三今天的开奖号