cb/assets/effect/ripple_shrink/ripple_shrink.effect
huanghaipeng ed2bfe78c8 特定关卡加首次过关率弹窗
冰冻按钮加未操作5秒 提示
2025-11-24 12:00:45 +08:00

111 lines
3.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

CCEffect %{
techniques:
- name: normal
passes:
- vert: vs
frag: fs
blendState:
targets:
- blend: true
rasterizerState:
cullMode: back
properties:
texture: { value: white }
center: { value: [0.5, 0.5] }
time: { value: 0.0 }
ringCount: { value: 5.0 }
ringWidth: { value: 0.04 }
waveSpeed: { value: 0.3 } // 扩散速度
shrink: { value: 2.0 } // 内缩强度
fadePow: { value= 2.0 } // 淡出速度
color: { value: [0.95, 0.95, 0.95, 0.45] } // 淡白
}%
CCProgram vs %{
precision highp float;
#include <cc-global>
#include <cc-local>
in vec3 a_position;
in vec2 a_uv0;
out vec2 v_uv0;
void main () {
vec4 pos = vec4(a_position, 1);
#if CC_USE_MODEL
pos = cc_matViewProj * cc_matWorld * pos;
#else
pos = cc_matViewProj * pos;
#endif
gl_Position = pos;
v_uv0 = a_uv0;
}
}%
CCProgram fs %{
precision highp float;
#include <cc-global>
#include <alpha-test>
in vec2 v_uv0;
uniform sampler2D texture;
uniform fs_uniforms {
vec4 color;
vec2 center;
float time;
float ringCount;
float ringWidth;
float waveSpeed;
float shrink;
float fadePow;
};
void main () {
vec4 tex = texture2D(texture, v_uv0);
float dist = distance(v_uv0, center);
float alpha = 0.0;
// 计算从中心到边界的最大距离
vec2 lowerDist = center;
vec2 upperDist = vec2(1.0 - center.x, 1.0 - center.y);
float maxDist = max(max(lowerDist.x, lowerDist.y), max(upperDist.x, upperDist.y));
// 设置渐隐开始和结束位置
float fadeStartDist = maxDist * 0.25; // 从中心向外1/4位置开始渐隐
float fadeEndDist = maxDist * 0.95; // 外圈往里一些位置完全隐藏
// 生成5个独立的波纹环每个间隔一定时间出现
for (int i = 0; i < 3; ++i) {
// 每个波纹环间隔0.3秒出现
float ringStartTime = float(i) * 0.3;
if (time < ringStartTime) continue;
// 当前波纹环的时间
float ringTime = time - ringStartTime;
// 波纹半径随时间增长
float radius = ringTime * waveSpeed;
// 当波纹超出边界时不再显示
if (radius > maxDist) continue;
if (radius > 1.5) continue;
float inner = radius - ringWidth;
float a = smoothstep(inner, radius, dist)
* (1.0 - smoothstep(radius, radius + 0.01, dist));
// 涟漪效果
a *= sin(dist * shrink - ringTime * 6.0) * 0.5 + 0.5;
a *= pow(1.0 - radius / 1.5, fadePow);
// 添加边界渐隐效果从1/4位置开始渐隐直到边界附近完全隐藏
if (radius > fadeStartDist) {
float boundaryFade = 1.0 - smoothstep(fadeStartDist, fadeEndDist, radius);
a *= boundaryFade;
}
alpha += a;
}
alpha = clamp(alpha, 0.0, 1.0);
gl_FragColor = vec4(color.rgb, alpha * color.a);
ALPHA_TEST(gl_FragColor);
}
}%