yyl
2025-05-30 8fa7de8988e476a48e9177c962b8fb4267fd5e34
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
 
Shader "GUI/ImageSmoothMask"
{
    Properties
    {
        [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
        _Color("Tint", Color) = (1,1,1,1)
 
        _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
 
        _ColorMask("Color Mask", Float) = 15
 
        _LeftBottom("Left Bottom", Vector) = (0, 0, 0, 0)
        _RightTop("Right Top", Vector) = (0, 0, 0, 0)
        _SmoothRect("SmoothRect", Vector) = (0, 0, 0, 0)
    }
 
        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
            ZTest[unity_GUIZTestMode]
            Blend SrcAlpha OneMinusSrcAlpha
            ColorMask[_ColorMask]
 
            Pass
            {
                CGPROGRAM
                #pragma target 3.0
                #pragma vertex vert
                #pragma fragment frag
                #include "UnityCG.cginc"
 
                float2 _LeftBottom;
                float2 _RightTop;
                float2 _SmoothRect;
 
                float2 SelfUVCalculate(float2 vertex)
                {
                    float length = abs((_LeftBottom - _RightTop).x);
                    float height = abs((_LeftBottom - _RightTop).y);
                    float2 pos = vertex - _LeftBottom;
 
                    return float2(pos.x / length, pos.y / height);
                }
                float MaskCalculate(float a, float2 uv)
                {
                    a *= uv.x < _SmoothRect.x ? smoothstep(0, 1, uv.x / _SmoothRect.x) : 1;
                    a *= uv.x > (1 - _SmoothRect.x) ? smoothstep(0, 1, (1 - uv.x) / _SmoothRect.x) : 1;
                    a *= uv.y > (1 - _SmoothRect.y) ? smoothstep(0, 1, (1 - uv.y) / _SmoothRect.y) : 1;
                    a *= uv.y < _SmoothRect.y ? smoothstep(0, 1, uv.y / _SmoothRect.y) : 1;
 
                    return a;
                }
 
                    struct appdata_t
                    {
                        float4 vertex   : POSITION;
                        float4 color    : COLOR;
                        float2 texcoord : TEXCOORD0;
                    };
 
                    struct v2f
                    {
                        float4 vertex   : SV_POSITION;
                        fixed4 color : COLOR;
                        half2 texcoord  : TEXCOORD0;
                        float4 texcoord1: TEXCOORD1;
                    };
 
                    fixed4 _Color;
 
                    v2f vert(appdata_t IN)
                    {
                    v2f OUT;
                    OUT.vertex = UnityObjectToClipPos(IN.vertex);
                    OUT.texcoord = IN.texcoord;
                    OUT.texcoord1 = IN.vertex;
                    #ifdef UNITY_HALF_TEXEL_OFFSET
                    OUT.vertex.xy += (_ScreenParams.zw - 1.0)*float2(-1,1);
                    #endif
                    OUT.color = IN.color * _Color;
                    return OUT;
                    }
 
                    sampler2D _MainTex;
 
                    bool IsInRect(float2 pos)
                    {
                        if (pos.x > _LeftBottom.x && pos.x < _RightTop.x && pos.y > _LeftBottom.y && pos.y < _RightTop.y)
                        {
                            return true;
                        }
                        return false;
                    }
 
                    fixed4 frag(v2f IN) : SV_Target
                    {
                    half4 color = tex2D(_MainTex, IN.texcoord) * IN.color;
                    float4 worldPos = mul(unity_ObjectToWorld, IN.texcoord1);
                    color.a = IsInRect(worldPos) ? 1 : 0;      //MaskCalculate(color.a, SelfUVCalculate(IN.texcoord1));
                    // clip(color.a - 0.01);
                    return color;
                    }
 
                    ENDCG
                }
 
            
        }
}