七、游戏表现:4、流光和边缘光叠加效果

2021-03-21  本文已影响0人  GameObjectLgy
Shader "MyLearn02/EdgeLight4"
{
    Properties
    {
        _RimRange("RimRange 边缘光范围",Range(0.0,10)) = 1.0
        _MainTex("Texture", 2D) = "white" {}
        _InnerColor("Inner Colorn 内发光颜色",Color) = (0.0,0.0,0.0,0.0)
        _InnerAlpha("Inner Alpha 内发光透明度",Range(0.0,1.0)) = 0.0
        _RimColor("Rim Color 边缘光颜色",Color) = (1,1,1,1)
        _RimIntensity("Rim Intensity 边缘光强度",Range(0.0,10)) = 1.0

        _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" }
        LOD 100

        Pass
        {
            ZWrite Off
            Blend SrcAlpha One
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float4 normal : NORMAL; // 法线信息 Get✔

            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 posCS : SV_POSITION; 
                float4 posWS : TEXCOORD1; // 世界空间顶点位置
                float3 nDirWS : TEXCOORD2; // 世界空间法线方向
                float3 pivot_world : TEXCOORD3;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _RimRange;
            float4 _InnerColor;
            float4 _RimColor;
            float _InnerAlpha;
            float _RimIntensity;
            sampler2D _FlowTex;
            float4 _FlowSpeed;
            float _FlowIntensity;
            float4 _FlowTilling;
            
            v2f vert (appdata v)
            {
                v2f o = (v2f)0;
                o.uv = v.uv;
                o.posCS = UnityObjectToClipPos(v.vertex); // 变换顶点位置 OS>CS
                o.posWS = mul(unity_ObjectToWorld, v.vertex); // 变换顶点位置 OS>WS
                o.nDirWS = UnityObjectToWorldNormal(v.normal); // 变换法线方向 OS>WS

                o.pivot_world = mul(unity_ObjectToWorld, float4(0.0, 0.0, 0.0, 1.0)).xyz;//相对于原点
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                //1、向量准备
                float3 nDir = i.nDirWS;//法线方向
                float3 lDir = _WorldSpaceLightPos0.xyz;//光方向
                float3 rDir = reflect(-lDir, nDir);//光反射方向
                float3 vDir = normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz);//观察方向

                //2、中间量准备:准备点击结果
                float ndotl = dot(nDir, lDir);
                //float vdotr = dot(vDir, rDir);
                float vdotr = dot(vDir, nDir);

                //3、光照模型Fresnel = pow(1-ndotv,powVal)。
                //1-ndotv:中间暗,边缘亮;
                //power:套一个power控制边缘亮的范围;
                half fresnel = 1.0 - saturate(vdotr);//菲尼尔
                half temp_fresnel = pow(fresnel, _RimRange);
                half emiss = tex2D(_MainTex, i.uv).r;
                emiss = pow(emiss, 5.0);//自发光
                float4 final_fresnel = saturate(emiss + temp_fresnel);

                //4、返回结果
                //edge                  
                half3 final_rim_color = lerp(_InnerColor.xyz, _RimColor.xyz * _RimIntensity, final_fresnel);
                half final_rim_alpha = final_fresnel;
                //float final_alpha = saturate(final_rim_alpha  + _InnerAlpha);
                //flow
                half2 uv_flow = (i.posWS.xy - i.pivot_world.xy) * _FlowTilling.xy;
                uv_flow = uv_flow + _Time.y * _FlowSpeed.xy;
                float4 flow_rgba = tex2D(_FlowTex, uv_flow) * _FlowIntensity;

                float3 final_col = final_rim_color.xyz + flow_rgba.xyz;
                float final_alpha = saturate(final_rim_alpha + flow_rgba.a + _InnerAlpha);
                return float4(final_col, final_alpha);
            }
            ENDCG
        }
    }
}

最终效果:


3.gif
上一篇下一篇

猜你喜欢

热点阅读