
更直观的视频演示在我的B站更直观的视频演示在我的B站
go
// Effect Syntax Guide: https://docs.cocos.com/creator/manual/zh/shader/index.html
// Effect Syntax Guide: https://docs.cocos.com/creator/manual/zh/shader/index.html
// Effect Syntax Guide: https://docs.cocos.com/creator/manual/zh/shader/index.html
// Effect Syntax Guide: https://docs.cocos.com/creator/manual/zh/shader/index.html
// 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: 0.0, editor: { slide: true, range: [0, 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>
#include <cc-global> // 添加cc_time支持
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 texAlpha = texColor.a;
// 如果完全透明,直接返回
if (texAlpha < 0.01) {
return texColor;
}
float angle = atan(uv.y - 0.5, uv.x - 0.5);
float dist = distance(uv, vec2(0.5));
// 🔴 危险脉冲(基于角度和距离)
float dangerPulse = sin(cc_time.x * 5.0 + angle * 3.0) * 0.5 + 0.5;
dangerPulse *= 1.0 - smoothstep(0.0, 0.5, dist); // 从中心向外的脉冲
// 🌈 颜色根据危险程度变化
vec3 dangerColor = mix(
vec3(1.0, 0.5, 0.0), // 橙色
vec3(1.0, 0.0, 0.0), // 红色
glowsize * 0.1
);
// ⚫ 裂纹效果
float crack = sin(angle * glowsize * 2.0 + cc_time.x) * 0.5 + 0.5;
// 基于纹理alpha控制效果强度
float effectStrength = texAlpha; // 不透明部分效果更强
// 组合效果
vec3 dangerEffect = dangerColor * dangerPulse * effectStrength * lightIntensity;
dangerEffect += vec3(0.5, 0.2, 0.0) * crack * effectStrength * 0.5;
// 混合原始颜色和效果
vec3 finalColor = texColor.rgb + dangerEffect;
// 边缘脉冲光晕
float edgeGlow = 1.0 - smoothstep(0.3, 0.5, dist);
vec3 edgeEffect = dangerColor * edgeGlow * sin(cc_time.x * 8.0) * 0.5 * texAlpha;
finalColor += edgeEffect;
return vec4(finalColor, texColor.a);
}
}%