cocos-awesome/assets/Scene/SwitchScene__DoomScreen/Materials/DoomScreen.effect

118 lines
3.1 KiB
Plaintext
Raw Normal View History

2024-09-23 01:08:09 +00:00
// Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
CCEffect %{
techniques:
- passes:
- vert: vs
frag: fs
blendState:
targets:
- blend: true
rasterizerState:
cullMode: none
properties:
bars: { value: 50, editor: { tooltip: "列数" }}
amplitude: { value: 2, editor: { tooltip: "速度0向下移动时没有变化值越高一些元素移动得更快" }}
noise: { value: 0.1, editor: { tooltip: "速度的离散程度0 = 无噪声1 = 噪声很大" }}
frequency: { value: 0.5, editor: { tooltip: "水平速度变化:值越大,波浪越短" }}
dripScale: { value: 0.5, editor: { tooltip: "屏幕两侧条形黏连的程度0 = 无滴落1 = 曲线滴落" }}
time: { value: 0 }
}%
CCProgram vs %{
precision highp float;
#include <cc-global>
#include <cc-local>
in vec3 a_position;
in vec4 a_color;
out vec4 v_color;
in vec2 a_uv0;
out vec2 v_uv0;
void main () {
vec4 pos = vec4(a_position, 1);
pos = cc_matViewProj * pos;
v_uv0 = a_uv0;
v_color = a_color;
gl_Position = pos;
}
}%
CCProgram fs %{
precision highp float;
uniform sampler2D texture;
uniform sampler2D texture2;
uniform DoomScreen {
float bars;
float amplitude;
float noise;
float frequency;
float dripScale;
float time;
};
float progress = time;
in mediump vec2 v_uv0;
in vec4 v_color;
vec4 getFromColor(vec2 uv) {
return texture(texture, uv);
}
vec4 getToColor(vec2 uv) {
return texture(texture2, uv);
}
float rand(int num) {
return fract(mod(float(num) * 67123.313, 12.0) * sin(float(num) * 10.3) * cos(float(num)));
}
float wave(int num) {
// 根据传入的索引值计算波浪的频率
float fn = float(num) * frequency * 0.1 * float(bars);
return cos(fn * 0.5) * cos(fn * 0.13) * sin((fn + 10.0) * 0.3) / 2.0 + 0.5;
}
float drip(int num) {
// 根据传入的索引值计算滴水效果的幅度
return sin(float(num) / float(bars - 1.0) * 3.141592) * dripScale;
}
// 计算条的位置
float pos(int num) {
// 如果没有噪声,则返回波浪效果;否则使用波浪效果和随机数进行混合
return (noise == 0.0 ? wave(num) : mix(wave(num), rand(num), noise)) + (dripScale == 0.0 ? 0.0 : drip(num));
}
vec4 transition(vec2 uv) {
// 根据水平位置计算当前条的索引值
int bar = int(uv.x * (float(bars)));
// 根据当前条的位置计算缩放比例和进度
float scale = 1.0 + pos(bar) * amplitude;
float phase = progress * scale;
// 计算垂直位置的比例
float posY = uv.y / vec2(1.0).y;
vec2 p;
vec4 c;
// 根据进度判断使用起始颜色还是目标颜色
if (phase + posY < 1.0) {
// 根据当前条的位置和进度计算新的垂直位置
p = vec2(uv.x, uv.y + mix(0.0, vec2(1.0).y, phase)) / vec2(1.0).xy;
// 获取起始颜色
c = getFromColor(p);
} else {
// 获取目标颜色
p = uv.xy / vec2(1.0).xy;
c = getToColor(p);
}
return c;
}
void main () {
gl_FragColor = v_color * transition(v_uv0);
}
}%