统一按钮在着色器中丢弃像素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了统一按钮在着色器中丢弃像素相关的知识,希望对你有一定的参考价值。

我正在使用我正在使用自己的着色器的按钮。这种方法很好,除了统一似乎在它们到达我的着色器之前丢弃/剪切像素。

我的图像的顶部和底部三分之一是透明的。如果我做像color = fixed4(1,0,0,1);只有中间部分是红色的。按钮和纹理都是方形的,我可以在场景视图中看到两者都正确定位。关于如何阻止按钮剪裁这些透明像素的任何想法?

着色器如下:

Shader "Custom/BlackTimerImage"
{
    Properties
    {
        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
        _Color ("Tint", Color) = (1,1,1,1)


        [PerRendererData] _PercentComplete("Percent Complete", Float) = .2

        _ColorMask ("Color Mask", Float) = 15

        [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
    }

    SubShader
    {
        Tags
        {
            "Queue"="Transparent"
            "IgnoreProjector"="True"
            "RenderType"="Transparent"
            "PreviewType"="Plane"
            "CanUseSpriteAtlas"="True"
        }

        Cull Off
        Lighting Off
        ZWrite Off
        ZTest [unity_GUIZTestMode]
        Blend SrcAlpha OneMinusSrcAlpha

        Pass
        {
            Name "Default"
        CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            #include "UnityUI.cginc"

            //#pragma multi_compile __ UNITY_UI_ALPHACLIP

            struct appdata_t
            {
                float4 vertex   : POSITION;
                float4 color    : COLOR;
                float2 texcoord : TEXCOORD0;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct v2f
            {
                float4 vertex   : SV_POSITION;
                fixed4 color    : COLOR;
                float2 texcoord  : TEXCOORD0;
                float4 worldPosition : TEXCOORD1;
            };

            fixed4 _Color;
            fixed4 _TextureSampleAdd;
            float _PercentComplete;
            v2f vert(appdata_t v)
            {
                v2f OUT;
                OUT.worldPosition = v.vertex;
                OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);

                OUT.texcoord = v.texcoord;

                OUT.color = v.color * _Color;
                return OUT;
            }

            sampler2D _MainTex;

            fixed4 frag(v2f IN) : SV_Target
            {
                half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;

                half2 up = float2(0, 1);
                half2 pixelRay = normalize(float2(.5-IN.texcoord.x, IN.texcoord.y-.5));
                float angle = (1-saturate((dot(up, pixelRay)+1) *.5))*.5;
                if (IN.texcoord.x < .5)
                {
                    angle = .5 + (.5 - angle);
                }

                if (angle > _PercentComplete) 
                {
                    color.rgb *= .5f;
                    if (color.a <= .10)
                    {
                        color.a = .5f;
                    }
                }

                return color;
            }
        ENDCG
        }
    }
}
答案

对于有类似问题的任何人,我最终删除了Image组件并添加了RawImage。没有剪辑!

以上是关于统一按钮在着色器中丢弃像素的主要内容,如果未能解决你的问题,请参考以下文章

在顶点和片段着色器中访问同名统一失败

如何在片段着色器中进行自定义模板测试

在片段着色器中,为啥我不能使用平面输入整数来索引 sampler2D 的统一数组?

GLSL:使用片段着色器进行对象翻译

满足条件时是不是可以在 GLSL 着色器中回调 C/C++ 函数/代码? [关闭]

跨多个着色器的 OpenGL 统一