111 lines
3.1 KiB
Plaintext
111 lines
3.1 KiB
Plaintext
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);
|
||
}
|
||
}% |