美文网首页
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