Shader顶点动画实现波浪效果

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Sam_ONE/article/details/83376474

首先要知道顶点函数中的一个顶点会包含以下信息:

  1. float3类型的顶点法线方向
  2. float3类型的顶点位置
  3. 甚至可能包含这个顶点的颜色信息(float4类型,注意:导入模型的默认材质不会显示顶点颜色的,我们需要自己编写一个着色器提取顶点颜色)

      (参考官方文档: https://docs.unity3d.com/Manual/SL-VertexProgramInputs.html

然后是使用正弦波来动态修改网格上每个顶点的位置,代码:

Shader "Sam'Shader编程/顶点动画(波形上下)" {

    Properties{

        _MainTex("主贴图(RGB)", 2D) = "white"{}
        _TintAmount("Tint Amount" ,Range(0,1)) = 0.5
        _ColorA("ColorA", Color) = (1,1,1,1)
        _ColorB("ColorB", Color) = (1,1,1,1)
        _Speed("Wave Speed", Range(0.1,80)) = 5
        _Frequency("Wave Frequency", Range(0,5)) = 2
        _Amplitude("Wave Amplitude", Range(-1,1)) = 1

    }

        SubShader{

            //Tags{"RenderMode" = "Opaque"}

            Pass{

            CGPROGRAM

#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
#include "UnityCG.cginc"

        sampler2D _MainTex;
        float4 _MainTex_ST;
        float _TintAmount;
        fixed4 _ColorA;
        fixed4 _ColorB;
        float _Speed;
        float _Frequency;
        float _Amplitude;

            struct appdata 
            {
                float4 texcoord : TEXCOORD0;
                float4 vertex : POSITION;//顶点位置
                //float3 normal : NORMAL;
            };


            struct v2f
            {
                float2 uv : TEXCOORD1;
                float3 vertColor : TEXCOORD2;
                float4 vertex : SV_POSITION;
            };


            v2f vert(appdata v)
            {
                v2f o;
                float time = _Time.y * _Speed;
                float waveValueA = sin(time + v.vertex.x *_Frequency)* _Amplitude;
                //sin(time + v.vertex.x) * _Amplitude;// + v.vertex.y + v.vertex.z

                //**2 得出的时间正弦值用的xyz(其中之一时) 不能与次出的因子为相同的轴 如:float3(v.vertex.x* waveValueA, v.vertex.y, v.vertex.z);

                //***或者 时间正弦值 直接用xyz的三个值相加计算 如shader顶点动画(波形水平) 中
                v.vertex.xyz = float3(v.vertex.x, v.vertex.y + waveValueA, v.vertex.z);

                //v.vertex = float4(v.vertex.x, v.vertex.y* waveValueA, v.vertex.z, v.vertex.w);
                o.vertex = UnityObjectToClipPos(v.vertex);

                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);

                // uv流动效果
                //o.uv += float2(0, time);

                // 颜色
                //o.vertColor = float3(waveValueA, waveValueA, waveValueA);



                return o;

            }

            fixed4 frag(v2f i) : SV_Target{

                fixed4 col = tex2D(_MainTex, i.uv);
                float3 tintColor = lerp(_ColorA, _ColorB, i.vertColor).rgb;
                col = fixed4(col.rgb * (tintColor * _TintAmount), col.a);
                return col;
            }

            ENDCG
            }
        }
}

效果(没怎么细调,可能看上去比较low):

猜你喜欢

转载自blog.csdn.net/Sam_ONE/article/details/83376474