cocos shader闪光

在这里插入图片描述

更直观的视频演示在我的B站更直观的视频演示在我的B站

go 复制代码
// Effect Syntax Guide: https://docs.cocos.com/creator/manual/zh/shader/index.html

CCEffect %{
  techniques:
  - name: glow
    passes:
    - vert: vs:vert

      frag: fs:frag
      blendState:
        targets:
        - blend: true

          blendSrc: src_alpha

          blendDst: one_minus_src_alpha
      depthStencilState:      
          depthTest: false  
          depthWrite: false 
      rasterizerState:
        cullMode: none
      properties:
        lightColor: { value: [1.0, 0.0, 0.0, 1.0], editor: { type: color } }
        lightIntensity: { value: 3.0, editor: { slide: true, range: [1, 10] } }
        glowsize: { value: 3.0, editor: { slide: true, range: [1, 10] } }
        pulseSpeed: { value: 2.0, editor: { slide: true, range: [0, 5] } }
        isBlinking: { value: 0, editor: { type: boolean } }
}%

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



  #include <builtin/uniforms/cc-local>
#endif
in vec3 a_position;

in vec2 a_texCoord;   
out vec2 uv;

#if USE_LOCAL
  in vec4 a_color; 

  out vec4 v_color; 
#endif


vec4 vert() {

  vec4 pos = vec4(a_position, 1);

  #if USE_LOCAL
    pos = cc_matWorld * pos; 

    v_color = a_color;
  #endif

  pos = cc_matViewProj * pos;
  uv = a_texCoord;
  
  return  pos;
}

}%

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

  in vec2 uv;

  uniform sampler2D mainTexture;
  uniform UBO {

    vec4 lightColor;
    float lightIntensity;
    float pulseSpeed;
    float time;
    float isBlinking;
    float glowsize;
  };


  vec4 frag () {
    // 获取原始纹理颜色
    
    // 获取原始纹理颜色
    vec4 texColor = texture(cc_spriteTexture, uv);
    
    // 脉冲和闪烁效果
    float pulse = 0.5 + 0.5 * sin(time * pulseSpeed);
    float blink = isBlinking > 0.5 ? (0.5 + 0.5 * sin(time * 8.0)) : 1.0;
    float intensity = lightIntensity * pulse * blink;
    
    // 基于alpha发光:透明部分不发光,不透明部分发光
    float glowAmount = texColor.a; // 直接使用alpha值作为发光强度
    
    // 创建光晕效果(简单边缘检测)
    float edgeGlow = 0.0;
    
    // 采样周围4个点
    float sampleAlpha1 = texture(cc_spriteTexture, uv + vec2(0.01, 0.01)).a;
    float sampleAlpha2 = texture(cc_spriteTexture, uv + vec2(-0.01, 0.01)).a;
    float sampleAlpha3 = texture(cc_spriteTexture, uv + vec2(-0.01, -0.01)).a;
    float sampleAlpha4 = texture(cc_spriteTexture, uv + vec2(0.01, -0.01)).a;
    
    // 如果周围有透明像素,当前像素在边缘
    float edgeDetect = 0.0;

    edgeDetect += step(0.5, abs(texColor.a - sampleAlpha1));
    edgeDetect += step(0.5, abs(texColor.a - sampleAlpha2));

    edgeDetect += step(0.5, abs(texColor.a - sampleAlpha3));
    edgeDetect += step(0.5, abs(texColor.a - sampleAlpha4));
    
    edgeGlow = edgeDetect * 0.25; // 边缘发光
    
    // 组合发光效果

    vec3 glow = lightColor.rgb * (glowAmount + edgeGlow * glowsize) * intensity;

    
    // 叠加到原始颜色
    vec3 finalColor = texColor.rgb + glow;
    
    return vec4(finalColor, texColor.a);
  }

}%
相关推荐
mxwin4 小时前
Unity Shader 半透明物体为什么不能写入深度缓冲?
unity·游戏引擎·shader
晚枫歌F6 小时前
三层时间轮的实现
网络·unity·游戏引擎
努力长头发的程序猿10 小时前
Unity使用ScriptableObject序列化资源
unity·游戏引擎
mxwin10 小时前
Unity Shader 手写基于 PBR 的 URP Lit Shader 核心光照计算
unity·游戏引擎·shader
魔士于安11 小时前
Unity windows 同步 异步 打开文件文件夹工具
游戏·unity·游戏引擎·贴图·模型
笑虾11 小时前
cocos2d-x lua 加载 Cocos Studio 导出的 csb
游戏引擎·lua·cocos2d
魔士于安11 小时前
unity lowpoly 风格 城市 建筑 道路 交通标志
游戏·unity·游戏引擎·贴图·模型
mxwin11 小时前
Unity GPU Shader 性能优化指南
unity·游戏引擎·shader
董董女友1 天前
unity mcp 配置指南
unity·游戏引擎
垂葛酒肝汤1 天前
Unity的可视化网格和文字标签
unity·游戏引擎