cocos creator 3.x shader 流光

ini 复制代码
CCEffect %{
  techniques:
  - passes:
    - vert: sprite-vs:vert
      frag: sprite-fs:frag
      depthStencilState:
        depthTest: false
        depthWrite: false
      blendState:
        targets:
        - blend: true
          blendSrc: src_alpha
          blendDst: one_minus_src_alpha
          blendDstAlpha: one_minus_src_alpha
      rasterizerState:
        cullMode: none
      properties:
        alphaThreshold: { value: 0.5 }
        u_flowSpeed: { value: 1.0 }
        u_flowWidth: { value: 0.3 }
        u_flowAngle: { value: 30.0 }
        u_flowTime: { value: 0.0 }
        u_flowColor: { value: [1,0,0,1] }
}%

CCProgram sprite-vs %{
  precision highp float;
  #include <builtin/uniforms/cc-global>
  #if USE_LOCAL
    #include <builtin/uniforms/cc-local>
  #endif

  in vec3 a_position;
  in vec2 a_texCoord;
  in vec4 a_color;

  out vec4 v_color;
  out vec2 v_uv;

  #if TWO_COLORED
    in vec4 a_color2;
    out vec4 v_color2;
  #endif

  // 必须包含名为 vert 的入口函数
  vec4 vert () {
    vec4 pos = vec4(a_position, 1);

    #if USE_LOCAL
      pos = cc_matWorld * pos;
    #endif

    pos = cc_matViewProj * pos;

    v_uv = a_texCoord;
    v_color = a_color;

    #if TWO_COLORED
      v_color2 = a_color2;
    #endif

    return pos;
  }
}%

CCProgram sprite-fs %{
  precision highp float;
  #include <builtin/internal/alpha-test>

  uniform FlowLight {
    vec4 u_flowColor;
    float u_flowTime;
    float u_flowSpeed;
    float u_flowWidth;
    float u_flowAngle;
  };

  in vec4 v_color;
  in vec2 v_uv;

  #if TWO_COLORED
    in vec4 v_color2;
  #endif

  #pragma builtin(local)
  layout(set = 2, binding = 12) uniform sampler2D cc_spriteTexture;

  float toRadians(float degrees) {
    return degrees * 0.017453292; // π/180
  }

  vec4 frag () {
    vec4 col = texture(cc_spriteTexture, v_uv);
    
    #if TWO_COLORED
      col.rgb = mix(v_color2.rgb, v_color.rgb, col.rgb);
      col.a *= v_color.a;
    #else
      col *= v_color;
    #endif

    // 斜向平行四边形流光
    float angle = toRadians(u_flowAngle);
    float slope = tan(angle);
    float flowPos = fract(u_flowTime * u_flowSpeed) * (1.0 + abs(slope));
    float distance = v_uv.x + slope * v_uv.y - flowPos;
    
    float mask = smoothstep(-u_flowWidth, 0.0, distance) * 
                (1.0 - smoothstep(0.0, u_flowWidth, distance));
    
    col.rgb += u_flowColor.rgb * mask * u_flowColor.a;

    ALPHA_TEST(col);
    return col;
  }
}%
相关推荐
粥里有勺糖10 小时前
视野修炼-技术周刊第129期 | 上一次古法编程是什么时候
前端·javascript·github
whuhewei10 小时前
JS获取CSS动画的旋转角度
前端·javascript·css
蓝黑202010 小时前
Vue组件通信之v-model
前端·javascript·vue
像素之间11 小时前
为什么运行时要加set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve
前端·javascript·vue.js
M ? A11 小时前
Vue转React实战:defineProps精准迁移实战
前端·javascript·vue.js·经验分享·react.js·开源·vureact
西陵11 小时前
别再写 Prompt 了Spec Mode 才是下一代 AI 编程范式
前端·人工智能·ai编程
如意猴11 小时前
【前端】002--怎样制作一个简历界面?
开发语言·前端·javascript
NickJiangDev11 小时前
Elpis Schema 动态组件与表单:配置驱动的完整 CRUD 闭环
前端
kerli11 小时前
Compose 组件:Box 核心参数及其 Bias 算法
android·前端
luckyCover11 小时前
TypeScript学习系列(二):高级类型篇
前端·typescript