59 lines
1.9 KiB
Plaintext
59 lines
1.9 KiB
Plaintext
shader_type canvas_item;
|
|
|
|
uniform float frequency = 5.0;
|
|
uniform float amplitude = 0.1; // Уменьшаем амплитуду для корректного отображения
|
|
uniform float speed = 5.0;
|
|
uniform float direction: hint_range(-1.0, 1.0) = -1.0;
|
|
|
|
uniform vec4 color1: source_color = vec4(0.0, 0.0, 0.0, 1.0);
|
|
uniform vec4 color2: source_color = vec4(0.235, 0.18, 0.235, 1.0);
|
|
uniform vec4 color3: source_color = vec4(0.235, 0.18, 0.235, 0.5);
|
|
uniform vec4 color4: source_color = vec4(0.0, 0.0, 0.0, 0.0);
|
|
uniform float opacity: hint_range(0.0, 1.0) = 0.5;
|
|
uniform float turn = 0.785; // 45 градусов в радианах (TAU / 8)
|
|
|
|
|
|
vec2 rotate_uv(vec2 uv, vec2 pivot, float rotation) {
|
|
float cosa = cos(rotation);
|
|
float sina = sin(rotation);
|
|
uv -= pivot;
|
|
return vec2(
|
|
cosa * uv.x - sina * uv.y,
|
|
sina * uv.x + cosa * uv.y
|
|
) + pivot;
|
|
}
|
|
|
|
void fragment() {
|
|
vec2 uv = FRAGCOORD.xy;
|
|
|
|
// Нормализуем UV-координаты в диапазоне [0, 1]
|
|
uv = uv * 0.15 - 1.0; // Преобразуем в диапазон [-1, 1]
|
|
|
|
// Поворот UV-координат на 45 градусов
|
|
float angle = radians(-60.0); // Преобразуем градусы в радианы
|
|
vec2 origin = vec2(0.0, 0.0);
|
|
uv = rotate_uv(uv, origin, angle);
|
|
|
|
// Преобразуем обратно в диапазон [0, 1]
|
|
uv = uv * 0.05 + 0.05;
|
|
|
|
// Вычисляем синусоидальную волну
|
|
float sine_wave = sin(uv.x * frequency + TIME * speed * direction) * amplitude;
|
|
uv.y += sine_wave;
|
|
|
|
float t = sin(uv.x * frequency + TIME * speed * direction);
|
|
|
|
vec4 final_color;
|
|
if (t < -0.5) {
|
|
final_color = color1;
|
|
} else if (t < 0.0) {
|
|
final_color = color2;
|
|
} else if (t < 0.5) {
|
|
final_color = color3;
|
|
} else {
|
|
final_color = color4;
|
|
}
|
|
|
|
final_color *= vec4(1.0, 1.0, 1.0, opacity);
|
|
COLOR = final_color;
|
|
} |