- Home /
 
When do _UseClipRect and _UseAlphaClip work in UI-Default.shader of newGUI?
This is the code for "DefaultResourcesExtra/UI/UI-Default.shader" which is part of the Unity built-in shader that is most frequently used in our project.
 Shader "UI/Default"
 {
    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
    }
 
    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 vertex vert
          #pragma fragment frag
 
          #include "UnityCG.cginc"
          #include "UnityUI.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;
             float4 worldPosition : TEXCOORD1;
          };
          
          fixed4 _Color;
          fixed4 _TextureSampleAdd;
    
          bool _UseClipRect;
          float4 _ClipRect;
 
          bool _UseAlphaClip;
 
          v2f vert(appdata_t IN)
          {
             v2f OUT;
             OUT.worldPosition = IN.vertex;
             OUT.vertex = mul(UNITY_MATRIX_MVP, OUT.worldPosition);
 
             OUT.texcoord = IN.texcoord;
             
             #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;
 
          fixed4 frag(v2f IN) : SV_Target
          {
             half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;
 
             if (_UseClipRect)
                color *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
             
             if (_UseAlphaClip)
                clip (color.a - 0.001);
 
             return color;
          }
       ENDCG
       }
    }
 }
 
               We've changed the "frag" part of the code, and applied it to objects' Mask and ScrollRect. Since shader seems to worked the same in UnityEdior, we believe that UI/Mask uses a stencil feature.
      fixed4 frag(v2f IN) : SV_Target
      {
         half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;
         return color;
      }
 
               If so, we want to know when _UseClipRect and _UseAlphaClip properties work in shader code. Also, we believe that if "if statement" is used in pixel shader there might be a performance reduction with low-end mobile devices. Would using materials with custom build shader be the only solution to solve this problem?
Your answer
 
             Follow this Question
Related Questions
Overlay Effect Shader - Very slow in mobile device 1 Answer
UI masking in a jet fighter HUD 0 Answers
Show only specific part of UI.Image 0 Answers
Compute shader FindKernel() fails with unity exception 0 Answers
UI shader write to depth buffer 2 Answers