美文网首页
七、游戏表现:3、流光效果

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

作者: GameObjectLgy | 来源:发表于2021-03-17 16:02 被阅读0次

    原理:采样一张纹理贴图,并让这张纹理随着时间做变化即有流动效果。
    为了让采样的纹理能从上往下依次进行扫描,需要从原始零点采样流光纹理。
    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

    相关文章

      网友评论

          本文标题:七、游戏表现:3、流光效果

          本文链接:https://www.haomeiwen.com/subject/nujzxltx.html