
CCEffect %{
  techniques:
  - passes:
    - vert: vs
      frag: fs
      blendState:
        targets:
        - blend: true
      rasterizerState:
        cullMode: none
      properties:
        texture: { value: white }
        alphaThreshold: { value: 0.5 }
        noiseAmount: { value: 0.5 } // 噪点强度，可在属性面板调整
}%

CCProgram vs %{
precision highp float;
#include <cc-global>
#include <cc-local>

in vec3 a_position;
in vec4 a_color;
out vec4 v_color;

#if USE_TEXTURE
  in vec2 a_uv0;
  out vec2 v_uv0;
#endif

void main() {
  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;
  gl_Position = pos;
}
}%

CCProgram fs %{
precision highp float;
#include <alpha-test>
#include <texture>

in vec4 v_color;

#if USE_TEXTURE
  in vec2 v_uv0;
  uniform sampler2D texture;
#endif

uniform EffectProperties {
  float noiseAmount;
};

float random(vec2 st) {
  return fract(sin(dot(st.xy, vec2(12.9898, 78.233))) * 43758.5453123);
}

void main() {
  vec4 col = v_color;
  #if USE_TEXTURE
    col *= texture2D(texture, v_uv0);
  #endif
  
  float noise = random(v_uv0);
  col.rgb += noise * noiseAmount;
  col.a = noise * 0.2;
  
  ALPHA_TEST(col);
  gl_FragColor = col;
}
}%
    