如何正确使用UGUI掩码和自定义字体

时间:2015-07-21 01:09:57

标签: unity3d

我想使用蒙版组件来显示带有自定义字体的文本。

但是就像照片说的那样:

当我使用自定义字体"无(材质)"时,蒙版效果很好,但文字不正常。 (图1)

有人教我将文本的材料更改为" Sprites-Default",然后文本将正确显示。当我更改材料时,文本显示正常,但是面具不起作用,它不能覆盖面具外的文本。 (图2)

我该怎样做才能使所有这些都运作良好?

Picture 1

Picture 2

1 个答案:

答案 0 :(得分:1)

当我使用Sprites-Default材料时,团结警告我" Material Sprite / Default没有模板属性"。所以我从UI-defaultFont.shader复制模板属性。感谢上帝,它有效。

这是我修改过的着色器:

使用此着色器创建材质并使用此材质。enter image description here

Shader "Custom/SpritesDefaultFont"
{
Properties
{
    [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
    _Color ("Tint", Color) = (1,1,1,1)
    [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0

    _StencilComp ("Stencil Comparison", Float) = 8
    _Stencil ("Stencil ID", Float) = 0
    _StencilOp ("Stencil Operation", Float) = 0
    _StencilWriteMask ("Stencil Write Mask", Float) = 255
    _StencilReadMask ("Stencil Read Mask", Float) = 255
}

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

    Stencil
    {
        Ref [_Stencil]
        Comp [_StencilComp]
        Pass [_StencilOp] 
        ReadMask [_StencilReadMask]
        WriteMask [_StencilWriteMask]
    }

    Cull Off
    Lighting Off
    ZWrite Off
    Blend One OneMinusSrcAlpha

    Pass
    {
    CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #pragma multi_compile _ PIXELSNAP_ON
        #include "UnityCG.cginc"

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

        struct v2f
        {
            float4 vertex   : SV_POSITION;
            fixed4 color    : COLOR;
            half2 texcoord  : TEXCOORD0;
        };

        fixed4 _Color;

        v2f vert(appdata_t IN)
        {
            v2f OUT;
            OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
            OUT.texcoord = IN.texcoord;
            OUT.color = IN.color * _Color;
            #ifdef PIXELSNAP_ON
            OUT.vertex = UnityPixelSnap (OUT.vertex);
            #endif

            return OUT;
        }

        sampler2D _MainTex;

        fixed4 frag(v2f IN) : SV_Target
        {
            fixed4 c = tex2D(_MainTex, IN.texcoord) * IN.color;
            c.rgb *= c.a;
            return c;
        }
    ENDCG
    }
}
}