UnityShader---顶点动画(序列帧、滚动的背景、顶点动画、广告牌)(内置渲染管线)---12

序列帧:

Shader "Unlit/22"
{
    Properties
    {
        _Color("Color",Color)=(1,1,1,1)
        _MainTex ("Texture", 2D) = "white" {}
        _HorizontalNum("HorizontalNum",Float)= 4
        _VerticalNum("VerticalNum",Float)=4
        _Speed("Speed",Range(0,100))=5
    }
    SubShader
    {
        Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
        LOD 100

        Pass
        {
            Tags{"LightMode"="ForwardBase"}

            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag           

            #include "UnityCG.cginc"

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

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

            fixed4 _Color;
            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _HorizontalNum;
            float _VerticalNum;
            float _Speed;

            v2f vert (a2v v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                float time = floor(_Time.y * _Speed);
                float row = floor(time/_HorizontalNum);
                float column = time - row * _HorizontalNum;

                half2 uv = half2(i.uv.x/_HorizontalNum,i.uv.y/_VerticalNum);
                uv.x += column / _HorizontalNum;
                uv.y += row / _VerticalNum;

                fixed4 col = tex2D(_MainTex , uv) * _Color;               
                return col;
            }
            ENDCG
        }
    }
    Fallback "Transparent/VertexLit"
}

滚动的背景:

Shader "Unlit/23"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _DetailTex("DetailTex",2D)="white"{}
        _SpeedX1("SpeedX1",Range(0,100))=5
        _SpeedX2("SpeedX2",Range(0,100))=10
        _Multipler("Multipler",Range(0,10))=1
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag           

            #include "UnityCG.cginc"

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

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

            sampler2D _MainTex;
            float4 _MainTex_ST;
            sampler2D _DetailTex;
            float4 _DetailTex_ST;
            float _SpeedX1;
            float _SpeedX2;
            float _Multipler;

            v2f vert (appdata v)
            {
                v2f o;

                o.vertex = UnityObjectToClipPos(v.vertex);

                //uv进行偏移:用不用frac都可以
                o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex) + frac( float2(_SpeedX1,0) * _Time.y);
                o.uv.zw = TRANSFORM_TEX(v.texcoord, _DetailTex) + frac( float2(_SpeedX2, 0) * _Time.y);

                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {               
                fixed4 col1 = tex2D(_MainTex, i.uv.xy);
                fixed4 col2 = tex2D(_DetailTex,i.uv.zw);
               
                //两层图混合:采用第二张图的透明值进行插值,即:第二张图a为0的地方显示下面的图,为1显示上方的图,中间的进行混合
                fixed4 final = lerp(col1,col2,col2.a);

                //提高亮度值
                final.rgb *= _Multipler;

                return final;
            }
            ENDCG
        }
    }
    Fallback "VertexLit"
}

顶点动画:

Shader "Unlit/24"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Color("Color",Color)=(1,1,1,1)
        _Magnitude("Distortion Magnitude",Float)=1
        _Frequency("Distortion Frequency",Float)=1
        _InvWaveLength("Distortion Inverse Wave Length",Float)=10
        _Speed("Speed",Float)=0.5
    }
    SubShader
    {
        //顶点动画Tags
        Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "DisableBatching"="True" }
       

        Pass
        {
            Tags{"LightMode"="ForwardBase"}

            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha
            Cull Off


            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
           

            #include "UnityCG.cginc"

            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed4 _Color;
            float _Magnitude;
            float _Frequency;
            float _InvWaveLength;
            float _Speed;


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

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

            v2f vert (a2v v)
            {
                v2f o;

                float4 offset;

                offset.xzw = float3(0,0,0);

                //根据不同x顶点位置动画
                offset.y = sin(_Time.y * _Frequency + v.vertex.x * _InvWaveLength ) * _Magnitude;

                o.pos = UnityObjectToClipPos(v.vertex + offset);

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

                //控制uv移动
                o.uv += float2(_Time.y * _Speed,0);
               
                return o;
            }

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

        //自定义顶点投射阴影pass
        Pass
        {
            Tags{"LightMode"="ShadowCaster"}

            CGPROGRAM

			#pragma vertex vert
			#pragma fragment frag
			
			#pragma multi_compile_shadowcaster
			
			#include "UnityCG.cginc"

            float _Magnitude;
            float _Frequency;
            float _InvWaveLength;
            float _Speed;

            struct a2v
            {
                float4 vertex:POSITION;
                float4 texcoord:TEXCOORD0;
                float3 normal:TEXCOORD1;
            };

            struct v2f
            {                
                //宏里会定义pos
                V2F_SHADOW_CASTER;
            };

            v2f vert(a2v v)
            {
                v2f o;

                float4 offset = float4(0,0,0,0);

                offset.y = sin(_Time.y * _Frequency + v.vertex.x * _InvWaveLength) * _Magnitude;

                v.vertex = v.vertex + offset;

                //此处需要 a2v中有定义normal,否则报错
                TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)                

                return o;
            }

            fixed4 frag(v2f i) :SV_Target
            {
                SHADOW_CASTER_FRAGMENT(i)
            }
            ENDCG
        }
    }
    //Fallback "VertexLit"
}

广告牌:

Shader "Unlit/25"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Color("Color",Color)=(1,1,1,1)
        _Ratio("Ratio",Range(0,1))=0.5
    }
    SubShader
    {
        Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Opaque" "DisableBatching"="True"}        

        Pass
        {
            Tags{"LightMode"="ForwardBase"}

            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha
            Cull Off

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag           

            #include "UnityCG.cginc"

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

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

            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed4 _Color;
            fixed _Ratio;

            v2f vert (appdata v)
            {
                v2f o;

                float3 center = float3(0,0,0);
                float3 viewer = mul(unity_WorldToObject,float4(_WorldSpaceCameraPos,1));

                float3 normalDir = viewer - center;
                normalDir.y *= _Ratio;
                normalDir = normalize(normalDir);

                float3 upDir = abs(normalDir.y > 0.999 ? float3(0, 0, 1) : float3(0, 1, 0));

                float3 rightDir = normalize(cross(upDir,normalDir));

                upDir = normalize(cross(normalDir,rightDir));

                float3 centerOffset = v.vertex.xyz - center;
                float3 localPos = center + rightDir * centerOffset.x + upDir * centerOffset.y + normalDir.z * centerOffset.z;

                o.vertex = UnityObjectToClipPos(float4(localPos,1));
                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);    

                o.uv.x = 1 - o.uv.x;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {           
                fixed4 col = tex2D(_MainTex, i.uv);
                col.rgb *= _Color.rgb;
               
                return col;
            }
            ENDCG
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值