cocos-awesome/assets/Scene/SwitchScene__DoomScreen/Materials/DoomScreen.effect
2024-09-23 23:51:46 +08:00

118 lines
3.1 KiB
Plaintext
Raw Permalink 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.

// 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);
}
}%