七、游戏表现:3、流光效果

原理:采样一张纹理贴图,并让这张纹理随着时间做变化即有流动效果。
为了让采样的纹理能从上往下依次进行扫描,需要从原始零点采样流光纹理。
float3 pos_world = mul(unity_ObjectToWorld, v.vertex).xyz;
o.pos_world = pos_world;
o.pivot_world = mul(unity_ObjectToWorld, float4(0.0, 0.0, 0.0, 1.0)).xyz;//相对于原点
o.normal = v.normal;
uv数值:
half2 uv_flow = (i.pos_world.xy - i.pivot_world.xy) * _FlowTilling.xy;
uv_flow = uv_flow + _Time.y * _FlowSpeed.xy;
采样:
float4 flow_rgba = tex2D(_FlowTex, uv_flow) * _FlowIntensity;

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "MyLearn01/LiuGuangHeadShader"
{
    Properties
    {
        _MainTex("Texture", 2D) = "" {}
        _FlowTex("Flow Tex 流光纹理",2D) = "white"{}
        _FlowTilling("Flow Tilling 流光纹理缩放偏移",Vector) = (1,1,0,0)
        _FlowSpeed("Flow Speed 流光速度",Vector) = (1,1,0,0)
        _FlowIntensity("Flow Intensity 流光强度",Float) = 0.5
    }
        SubShader
        {
            //Tags { "RenderType" = "Transparent" }
            Tags { "RenderType" = "Opaque" }
            LOD 100
            Pass
            {
                //ZWrite Off
                //Blend SrcAlpha One
                CGPROGRAM
                #pragma vertex vert 
                #pragma fragment frag 
                #include "UnityCG.cginc"  

            struct appdata  //CPU向顶点Shader提供的模型数据
            {
                //冒号后面的是特定语义词,告诉CPU需要哪些类似的数据
                float4 vertex : POSITION; //模型空间顶点坐标
                half2 texcoord0 : TEXCOORD0; //第一套UV

                half4 color : COLOR; //顶点颜色
                half3 normal : NORMAL; //顶点法线
                half4 tangent : TANGENT; //顶点切线(模型导入Unity后自动计算得到)
            };

            struct v2f  //自定义数据结构体,顶点着色器输出的数据,也是片元着色器输入数据
            {
                float4 pos : SV_POSITION; //输出裁剪空间下的顶点坐标数据,给光栅化使用,必须要写的数据
                float2 uv : TEXCOORD0; //自定义数据体
                float3 normal : TEXCOORD1;
                float3 pos_world : TEXCOORD2;
                float3 pivot_world : TEXCOORD3;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            float4 _FlowTilling;
            float4 _FlowSpeed;
            sampler2D _FlowTex;
            float _FlowIntensity;

            //顶点Shader
            v2f vert(appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);//获取模型顶点坐标位置。这一一句和上面四句等价
                //o.uv = v.texcoord0 * _MainTex_ST.xy + _MainTex_ST.zw;//使用纹理的Tiling和Offset。这一句和下面这句等价
                o.uv = TRANSFORM_TEX(v.texcoord0, _MainTex);

                float3 pos_world = mul(unity_ObjectToWorld, v.vertex).xyz;
                o.pos_world = pos_world;
                o.pivot_world = mul(unity_ObjectToWorld, float4(0.0, 0.0, 0.0, 1.0)).xyz;//相对于原点
                o.normal = v.normal;
                return o;
            }
            //片元Shader
            half4 frag(v2f i) : SV_Target //SV_Target表示为:片元Shader输出的目标地(渲染目标)
            {
                //流光
                half2 uv_flow = (i.pos_world.xy - i.pivot_world.xy) * _FlowTilling.xy;
                //half2 uv_flow = i.uv * _FlowTilling.xy;
                uv_flow = uv_flow + _Time.y * _FlowSpeed.xy;
                float4 flow_rgba = tex2D(_FlowTex, uv_flow) * _FlowIntensity;

                fixed4 final_col = tex2D(_MainTex, i.uv) + flow_rgba;

                return final_col;
            }
            ENDCG
        }
    }
}

效果图:

2.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容