美文网首页
SpriteShader备注——透明度加深

SpriteShader备注——透明度加深

作者: BacteriumFox | 来源:发表于2020-01-07 22:51 被阅读0次

    效果:

    透明度加强.gif
    原图

    作用:将图片中半透明的像素进行加深

    //////////////////////////////////////////////
    /// 2DxFX v3 - by VETASOFT 2018 //
    //////////////////////////////////////////////
    
    
    //////////////////////////////////////////////
    
    Shader "2DxFX_Extra_Shaders/AlphaIntensity"
    {
        Properties
        {
            //精灵纹理
            [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
            //透明度衰减(实际上这里应该是描边强度)       范围
            _AlphaIntensity_Fade_1("_AlphaIntensity_Fade_1", Range(0, 6)) = 1
            //精灵渐淡
            _SpriteFade("SpriteFade", Range(0, 1)) = 1.0
    
            // required for UI.Mask
            [HideInInspector]_StencilComp("Stencil Comparison", Float) = 8
            [HideInInspector]_Stencil("Stencil ID", Float) = 0
            [HideInInspector]_StencilOp("Stencil Operation", Float) = 0
            [HideInInspector]_StencilWriteMask("Stencil Write Mask", Float) = 255
            [HideInInspector]_StencilReadMask("Stencil Read Mask", Float) = 255
            [HideInInspector]_ColorMask("Color Mask", Float) = 15
    
        }
    
        SubShader
        {
            //      渲染队列=透明通道       忽略投影                    渲染类型                    预览类型 = 平面           可以使用精灵图片吗
            Tags {"Queue" = "Transparent" "IgnoreProjector" = "true" "RenderType" = "Transparent" "PreviewType"="Plane" "CanUseSpriteAtlas"="True" }
            ZWrite Off //是否要将像素的深度写入深度缓存中
            Blend SrcAlpha OneMinusSrcAlpha //Shader Blend混合效果:透明度混合
            Cull Off//背面渲染剔除
    
            // required for UI.Mask
            Stencil
            {
            Ref [_Stencil]
            Comp [_StencilComp]
            Pass [_StencilOp]
            ReadMask [_StencilReadMask]
            WriteMask [_StencilWriteMask]
            }
    
            Pass
            {
    
                CGPROGRAM
                // vert函数 包含 顶点着色器代码
                #pragma vertex vert
                // frag函数 包含 片元着色器代码
                #pragma fragment frag
                //使用用低精度(一般是指fp16),以提升片段着色器的运行速度,减少时间。
                #pragma fragmentoption ARB_precision_hint_fastest
                #include "UnityCG.cginc"
    
                //顶点着色器的输入结构体
                struct appdata_t{
                    float4 vertex   : POSITION;//顶点坐标
                    float4 color    : COLOR;//颜色
                    float2 texcoord : TEXCOORD0;//纹理坐标集
                };
    
                //顶点着色器的输出/片元着色器的输入结构体
                struct v2f
                {
                    float2 texcoord  : TEXCOORD0;//纹理坐标集
                    float4 vertex   : SV_POSITION;//平面顶点坐标
                    float4 color    : COLOR;//颜色
                };
    
                //对应最上面材质属性声明
                sampler2D _MainTex;
                float _SpriteFade;
                float _AlphaIntensity_Fade_1;
    
                //顶点着色器
                v2f vert(appdata_t IN)
                {
                    v2f OUT;
                    OUT.vertex = UnityObjectToClipPos(IN.vertex);//将顶点转换到裁剪坐标系
                    OUT.texcoord = IN.texcoord;
                    OUT.color = IN.color;
                    return OUT;
                }
                
                //New   透明度计算           纹理  透明度强度   
                float4 AlphaIntensity(float4 txt,float fade)
                {
                    //如果纹理透明度小于1,将透明度与透明度强度相乘
                    if (txt.a < 1)
                        txt.a = txt.a*fade;
                    return txt;
                }
    
                //片元着色器
                float4 frag (v2f i) : COLOR
                {
                    float4 _MainTex_1 = tex2D(_MainTex, i.texcoord);//纹理采样
    
                    //New  这里将材质中半透明的顶点进行透明度加深
                    float4 AlphaIntensity_1 = AlphaIntensity(_MainTex_1,_AlphaIntensity_Fade_1);
    
                    float4 FinalResult = AlphaIntensity_1;//声明最终输出纹理
                    FinalResult.rgb *= i.color.rgb;
                    FinalResult.a = FinalResult.a * _SpriteFade * i.color.a;//透明度与渐淡参数相乘
                    return FinalResult;
                }
    
            ENDCG
            }
        }
        Fallback "Sprites/Default"
    }
    

    相关文章

      网友评论

          本文标题:SpriteShader备注——透明度加深

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