【原】unity3d刀光闪过

Unity Shader 透明效果实现
本文介绍了一种使用Unity Shader实现带有透明渐变效果的方法。通过定义两个纹理属性,一个作为主纹理,另一个用于透明渐变,并在片段着色器中进行混合。此外,还提供了一个简单的Shader Controller脚本来控制渐变效果的显示与隐藏。

shader文件:

Shader "Custom/Logo" {
    Properties {
        _MainTex ("Texture", 2D) = "white" { }
        _Spec ("Texture", 2D) = "white" { }//透明渐变的图
    }
    SubShader
    {
        pass
        {
        Tags {"IgnoreProjector"="True" "RenderType"="Transparent"}
    
            ZWrite off
            Blend SrcAlpha OneMinusSrcAlpha
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            sampler2D _MainTex;
            sampler2D _Spec;
            
            float _show;
            float4 _MainTex_ST;
            float4 _Spec_ST;
            struct v2f {
                float4  pos : SV_POSITION;
                float2  uv : TEXCOORD0;
                float2  uv2 : TEXCOORD1;
            } ;
            v2f vert (appdata_base v)
            {
                v2f o;
                o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
                o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
                
                o.uv2 = TRANSFORM_TEX(v.texcoord,_Spec);
                return o;
            }
            float4 frag (v2f i) : COLOR
            {
                 float4 outp;
                float4 texCol = tex2D(_MainTex,i.uv);
                
                float4 texSpec = tex2D(_Spec,i.uv2);
                outp = texCol;
                
                if(texCol.w > 0.5)
                {
                       outp += float4(texSpec.x,texSpec.y,texSpec.z,1)*texSpec.w ;
                }
                
                if(_show >0)
                    return outp;
                else
                    return texCol;
            }
            ENDCG
        }
    }
    
    Fallback "Unlit/Transparent"
}

shaderController:

public class ShaderControll : MonoBehaviour {
   
    bool flag;
    // Use this for initialization
    void Start () {
        flag=false;
    
   InvokeRepeating("Fire",1,2);
    }
    
    // Update is called once per frame
    void Update () {
        if(flag)
            {
                renderer.material.SetFloat("_show",1);
                
                renderer.material.SetTextureOffset("_Spec",new Vector2(1 * Time.time,0));
            }
            else
            {
                renderer.material.SetFloat("_show",-1);
            }
    }
    
    
    void Fire()
    {
        renderer.material.SetTextureOffset("_Spec",new Vector2(0,0));
        flag=true;
        Invoke("SetFlag",0.5f);
    }
    void SetFlag()
    {
        flag=false;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值