Unity shader 圆形进度条

这篇博客详细介绍了如何使用Unity的Shader语言CG来创建一个自定义的Circular ProgressBar Shader。Shader通过输入的背景纹理、遮罩纹理、颜色、速率等属性,实现了在屏幕上动态显示圆形进度的效果。关键代码包括顶点着色器和片段着色器的编写,以及利用角度计算和颜色混合来控制进度条的显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Shader "Custom/CircularProgressBarShader"
{
    Properties
    {
        _BGTex("Background Texture",2D) = "white"{}
        //[PerRendererData] 
        _MaskTex("Mask Texture", 2D) = "white" {}
        _Color("Tint", Color) = (1,1,1,1)
        _Rate("Rate", range(0,100)) = 100
        _Center("Center", vector) = (.5,.5,0,0)
        _Width("Width", float) = 1
        //[Toggle(CLOCK_WISE)]
        _ColorMask("Color Mask", Float) = 15
        _MaskDetail("Mask Detail",range(0,1)) = 0.3
    }
    SubShader
    {
      Tags
      {
        "Queue" = "Transparent"
        "IgnoreProjector" = "True"
        "RenderType" = "Transparent"
        "PreviewType" = "Plane"
        "CanUseSpriteAtlas" = "True"
       }
       Cull Off
       Lighting Off
       ZWrite Off
       ZTest[unity_GUIZTestMode]
       Blend SrcAlpha OneMinusSrcAlpha
       ColorMask[_ColorMask]
       Pass
       {
         CGPROGRAM
         #pragma vertex vert
         #pragma fragment frag
         #pragma shader_feature CLOCK_WISE

         #include "UnityCG.cginc"

         float _Rate;
         float4 _Center;
         half _Width;

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

         struct v2f
         {
           float4 vertex   : SV_POSITION;
           fixed4 color    : COLOR;
           half2 mask_uv   : TEXCOORD0;
           half2 bg_uv     : TEXCOORD1;
          };

          fixed4 _Color;
          float4 _ClipRect;
          bool _UseClipRect;
          bool _UseAlphaClip;
          fixed _MaskDetail;
          sampler2D _MaskTex;
          sampler2D _BGTex;
          float4 _MaskTex_ST;
          float4 _BGTex_ST;

          v2f vert(appdata_t IN)
          {
            v2f OUT;
            OUT.vertex = UnityObjectToClipPos(IN.vertex);
            OUT.mask_uv = TRANSFORM_TEX(IN.texcoord,_MaskTex);
            OUT.bg_uv = TRANSFORM_TEX(IN.texcoord,_BGTex);
            OUT.color = IN.color * _Color;
            return OUT;
          }

          fixed4 frag(v2f IN) : SV_Target
          {
            half4 color = tex2D(_MaskTex, IN.mask_uv)* IN.color;
            float2 pos = IN.mask_uv.xy - _Center.xy;
            float ang = degrees(atan2(pos.x, -pos.y)) + 180;
            float angle = _Rate * 3.6;
            color.a = color.a * saturate((ang - angle) / _Width);
            half4 bgcolor = tex2D(_BGTex, IN.bg_uv) * IN.color;
            float mask_a = step(_MaskDetail,color.a);
            color = mask_a * color + (1 - mask_a)*bgcolor;
            return color;
           }
        ENDCG
       }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值