Cocos creator 3.6及以上版本的 Label 文字渐变如何实现?

以下是Shader但是无法实现文字渐变效果,求指点!

// Copyright © 2017-2018 Xiamen Yaji Software Co., Ltd.

CCEffect %{

techniques:

  • passes:

    • vert: label-vs:vert

      frag: label-fs:frag

      blendState:

      targets:

      • blend: true

      rasterizerState:

      cullMode: none

      properties:

      mainTexture: { value: white }

      alphaThreshold: { value: 0.5 }

      angle: {

      value: 0.0,
      
      editor: { tooltip: "角度", range: [0.0, 360.0] }
      

      }

      offset: {

      value: 0.0,
      
      editor: { tooltip: "偏移" }
      

      }

      uvRatio: {

      value: 1.0,
      
      editor: { tooltip: "比例" }
      

      }

      beginColor: {

      value: [1, 1, 1, 1],
      
      editor: { type: color, tooltip: "初始颜色" }
      

      }

      endColor: {

      value: [1, 1, 1, 1],
      
      editor: { type: color, tooltip: "结束颜色" }
      

      }

}%

CCProgram label-vs %{

precision highp float;

#include <builtin/uniforms/cc-global>

#if USE_LOCAL

#include <builtin/uniforms/cc-local>

#endif

in vec3 a_position;

in vec4 a_color;

out vec4 v_color;

#if USE_TEXTURE

in vec2 a_uv0;

out vec2 v_uv0;

#endif

vec4 vert () {

vec4 pos = vec4(a_position, 1);



#if CC_USE_MODEL

pos = cc_matViewProj * cc_matWorld * pos;

#else

pos = cc_matViewProj * pos;

#endif



#if USE_TEXTURE

  v_uv0 = a_uv0;

#endif



v_color = a_color;

return pos;

}

}%

CCProgram label-fs %{

precision highp float;

#include <builtin/internal/alpha-test>

#include <builtin/uniforms/cc-global>

in vec4 v_color;

#if USE_TEXTURE

in vec2 v_uv0;

uniform sampler2D mainTexture;

#endif

uniform Factor {

  float angle;

  float offset;

  float uvRatio;

};

uniform Constant {

  vec4 beginColor;

  vec4 endColor;

};

vec4 frag () {

vec4 o = vec4(1, 1, 1, 1);



#if USE_TEXTURE

  texture(mainTexture, v_uv0);

#endif

o *= v_color;

ALPHA_TEST(o);



float angleInRadians = radians(angle);

float ratio = clamp((v_uv0.y * cos(angleInRadians) + v_uv0.x * sin(angleInRadians) + offset) * uvRatio, 0.0, 1.0);

float beginRatio = 1.0 - ratio;

float endRatio = ratio;



o = vec4(

  o.r * (beginColor.r * beginRatio + endColor.r * endRatio),

  o.g * (beginColor.g * beginRatio + endColor.g * endRatio),

  o.b * (beginColor.b * beginRatio + endColor.b * endRatio),

  o.a * (beginColor.a * beginRatio + endColor.a * endRatio)

);

return o;

}

}%