美文网首页
七、游戏表现:4、流光和边缘光叠加效果

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

作者: GameObjectLgy | 来源:发表于2021-03-21 15:41 被阅读0次
    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

    相关文章

      网友评论

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

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