исправление
This commit is contained in:
59
Shaders/load.gdshader
Normal file
59
Shaders/load.gdshader
Normal file
@@ -0,0 +1,59 @@
|
||||
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;
|
||||
}
|
||||
118
Shaders/loadead.gdshader
Normal file
118
Shaders/loadead.gdshader
Normal file
@@ -0,0 +1,118 @@
|
||||
shader_type canvas_item;
|
||||
|
||||
// Конфигурационные униформы для кольца.
|
||||
uniform float dot_scale : hint_range(0.1, 9.1) = 0.5; // Масштаб точек кольца.
|
||||
uniform float ring_radius : hint_range(0.1, 1.0) = 0.2; // Радиус кольца.
|
||||
uniform int num_points : hint_range(3, 10) = 8; // Количество точек на кольце.
|
||||
uniform float gap_ratio : hint_range(0.0, 0.9) = 0.22; // Отношение пробелов между точками.
|
||||
uniform bool all_dots_same_size = false; // Флаг, указывающий, должны ли все точки быть одинакового размера.
|
||||
|
||||
// Визуальные свойства точек кольца.
|
||||
uniform vec4 dot_color_start : source_color = vec4(0.5, 0.0, 0.5, 1.0); // Начальный цвет точек.
|
||||
uniform vec4 dot_color_end : source_color = vec4(0.8, 0.5, 1.0, 1.0); // Конечный цвет точек.
|
||||
uniform bool enable_shadow = true; // Флаг для включения/выключения теней.
|
||||
uniform vec4 shadow_color : source_color = vec4(0.0, 0.0, 0.0, 0.35); // Цвет теней.
|
||||
uniform vec2 shadow_offset = vec2(0.03, 0.01); // Смещение теней от точек.
|
||||
|
||||
// Контроль анимации кольца.
|
||||
uniform float rotation_speed : hint_range(0.0, 10.0) = 1.5; // Скорость вращения кольца.
|
||||
|
||||
// Новые униформы для текстуры иконки и её внешнего вида.
|
||||
uniform sampler2D icon_texture; // Текстура иконки.
|
||||
uniform float icon_size : hint_range(0.0, 1.0) = 0.15; // Контроль радиуса иконки.
|
||||
|
||||
// Новые униформы для контроля вращения иконки.
|
||||
uniform bool enable_icon_rotation = false; // Флаг для включения вращения иконки.
|
||||
uniform bool reverse_icon_rotation = false; // Флаг для инверсии вращения иконки.
|
||||
uniform float icon_rotation_speed : hint_range(-10.0, 10.0) = 1.0; // Скорость вращения иконки.
|
||||
|
||||
// Униформ для контроля отрисовки иконки.
|
||||
uniform bool show_icon = false; // Если false, текстура иконки игнорируется.
|
||||
|
||||
void fragment() {
|
||||
// Преобразование UV-координат для центрирования начала координат и корректировки в зависимости от аспекта экрана.
|
||||
float aspect_ratio = SCREEN_PIXEL_SIZE.x / SCREEN_PIXEL_SIZE.y;
|
||||
vec2 uv = (UV * 2.0 - 1.0) * vec2(0.3, aspect_ratio); // Нормализация UV координат.
|
||||
|
||||
// Подсчет кольца (точек и опциональной тени).
|
||||
vec4 ring_color = vec4(0.0); // Начальный цвет кольца.
|
||||
float dot_accum = 0.0; // Накапливаемый вклад от точек.
|
||||
float shadow_accum = 0.0; // Накапливаемый вклад от теней.
|
||||
|
||||
float total_angle = 6.283185307; // Полный круг в радианах (2π).
|
||||
float gap = total_angle * gap_ratio; // Вычисление ширины пробела между точками.
|
||||
float spacing = (total_angle - gap) / float(num_points); // Вычисление интервала между точками.
|
||||
|
||||
// Определение направления вращения кольца.
|
||||
float direction = 1.0; // Вращение по часовой стрелке или против.
|
||||
float rotation = TIME * rotation_speed * direction; // Вычисление текущего угла поворота.
|
||||
|
||||
for (int i = 0; i < num_points; i++) { // Проход по каждой точке кольца.
|
||||
float angle = rotation + spacing * float(i); // Вычисление угла для данной точки.
|
||||
|
||||
vec2 pos = vec2(cos(angle), sin(angle)) * ring_radius; // Вычисление позиции точки по окружности.
|
||||
|
||||
// Вычисление размера точки:
|
||||
float size_factor = 0.5 + (float(i) / float(num_points)); // Фактор уменьшения размера.
|
||||
float radius = all_dots_same_size ? 0.1 * dot_scale : 0.1 * size_factor * dot_scale; // Радиус точки.
|
||||
|
||||
// Интерполяция цвета точки вдоль кольца от начала к концу.
|
||||
float gradient_factor = float(i) / float(num_points - 1); // Фактор градиента для цветовой интерполяции.
|
||||
vec4 dot_color = mix(dot_color_start, dot_color_end, gradient_factor); // Цвет точки.
|
||||
|
||||
// Вычисление вклада точки на основе расстояния.
|
||||
float distance = length(uv - pos); // Расстояние до текущей точки.
|
||||
float contribution = smoothstep(radius + 0.01, radius, distance); // Плавный вклад на основе расстояния.
|
||||
|
||||
if (contribution > 0.0) { // Если вклад точки больше нуля,
|
||||
ring_color = mix(ring_color, dot_color, contribution); // Смешивание с цветом кольца.
|
||||
dot_accum += contribution; // Накопление вклада от точки.
|
||||
}
|
||||
|
||||
// Опциональная тень за каждой точкой.
|
||||
if (enable_shadow) {
|
||||
vec2 shadow_pos = pos + shadow_offset; // Позиция для тени.
|
||||
float shadow_dist = length(uv - shadow_pos); // Расстояние до тени.
|
||||
float shadow_contrib = smoothstep(radius * 1.2 + 0.005, radius * 1.2, shadow_dist); // Вклад от тени.
|
||||
shadow_accum += shadow_contrib; // Накопление вклада от теней.
|
||||
}
|
||||
}
|
||||
|
||||
// Определение базового цвета для кольца или тени.
|
||||
vec4 base_color = vec4(0.0); // Начальный цвет.
|
||||
if (dot_accum > 0.0) { // Если есть вклад от точек,
|
||||
base_color = ring_color; // Установка базового цвета на цвет кольца.
|
||||
} else if (enable_shadow && shadow_accum > 0.0) { // Если тени включены и есть вклад от теней,
|
||||
base_color = shadow_color; // Установка базового цвета на цвет тени.
|
||||
}
|
||||
|
||||
// Отрисовка иконки - приступаем только если show_icon истинно.
|
||||
if (show_icon) {
|
||||
// Создание радиальной маски, чтобы иконка была видимой внутри радиуса icon_size.
|
||||
float icon_mask = smoothstep(icon_size, icon_size - 0.005, length(uv)); // Маска для иконки.
|
||||
|
||||
// Нормализация UV-координат для иконки.
|
||||
vec2 icon_uv = (uv / icon_size + vec2(1.0)) / 2.0; // Превращение из диапазона (-icon_size ... +icon_size) в (0 ... 1).
|
||||
|
||||
// Применение вращения иконки, если оно включено.
|
||||
if (enable_icon_rotation) {
|
||||
float icon_angle = TIME * icon_rotation_speed; // Угол вращения на основе времени и скорости вращения.
|
||||
if (reverse_icon_rotation) {
|
||||
icon_angle = -icon_angle; // Инверсия угла, если требуется.
|
||||
}
|
||||
// Вращение вокруг центра (0.5, 0.5) текстуры иконки.
|
||||
vec2 centered_uv = icon_uv - vec2(0.5); // Смещение UV координат.
|
||||
float s = sin(icon_angle); // Синус угла.
|
||||
float c = cos(icon_angle); // Косинус угла.
|
||||
centered_uv = vec2(centered_uv.x * c - centered_uv.y * s,
|
||||
centered_uv.x * s + centered_uv.y * c); // Применение матрицы вращения.
|
||||
icon_uv = centered_uv + vec2(0.5); // Смещение обратно к нормализованным координатам.
|
||||
}
|
||||
|
||||
vec4 icon_sample = texture(icon_texture, icon_uv); // Получение цвета из текстуры иконки.
|
||||
// Смешивание текстуры иконки с базовым цветом кольца с учетом маски и альфа-канала текстуры.
|
||||
base_color = mix(base_color, icon_sample, icon_mask * icon_sample.a);
|
||||
}
|
||||
|
||||
COLOR = base_color; // Установка финального цвета для текущего пикселя.
|
||||
}
|
||||
24
Shaders/opt_btn.gdshader
Normal file
24
Shaders/opt_btn.gdshader
Normal file
@@ -0,0 +1,24 @@
|
||||
shader_type canvas_item;
|
||||
uniform float range: hint_range(0.0, 0.5);
|
||||
uniform vec4 color: source_color;
|
||||
|
||||
const float ds = 0.01; /* Относительное расстояние на котором выполняется сглаживание краёв */
|
||||
const vec2 center = vec2(0.125, 0.125); /* Центр должен быть в (0.5, 0.5), но это не так */
|
||||
const float radius = 0.125 - ds * 2.0; /* Радиус должен быть 0.5, но это не так */
|
||||
|
||||
|
||||
float smooth_px(float r, float R)
|
||||
{
|
||||
return 1.0 - smoothstep(R - ds, R + ds, r);
|
||||
}
|
||||
|
||||
|
||||
void fragment()
|
||||
{
|
||||
vec2 centere = vec2(0.5);
|
||||
float df = distance(UV, centere);
|
||||
float circlee = step(range, df);
|
||||
|
||||
|
||||
COLOR *= color * smooth_px(circlee, radius);
|
||||
}
|
||||
84
Shaders/ray_2.gdshader
Normal file
84
Shaders/ray_2.gdshader
Normal file
@@ -0,0 +1,84 @@
|
||||
shader_type canvas_item;
|
||||
|
||||
uniform vec4 color_signal: source_color;
|
||||
uniform float turn = 0.785;
|
||||
uniform float inner_radius = 0.32;
|
||||
|
||||
const float outer_radius = 0.109;
|
||||
const float zoom = 100.0;
|
||||
const float speed = 2.1;
|
||||
const float size = 9.0;
|
||||
const float blur = 0.000001;
|
||||
const float fill_ratio = 0.03;
|
||||
|
||||
|
||||
float remap(float i_min, float i_max, float o_min, float o_max, float val) {
|
||||
float t = (val - i_min) / (i_max - i_min);
|
||||
return o_min + (o_max - o_min) * t;
|
||||
}
|
||||
|
||||
|
||||
float mask(vec2 uv, float value)
|
||||
{
|
||||
float r = atan(uv.x, uv.y);
|
||||
r = remap(-PI, PI, 0.0, 1.0, r);
|
||||
r = step(r, value * 0.5);
|
||||
|
||||
uv.x = uv.x + 1.0;
|
||||
uv.x = uv.x * -1.0;
|
||||
uv.x += 1.0;
|
||||
float l = atan(uv.x, uv.y);
|
||||
l = remap(-PI, PI, 0.0, 1.0, l);
|
||||
l = step(l, value * 0.5);
|
||||
|
||||
return r + l ;
|
||||
}
|
||||
|
||||
|
||||
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,
|
||||
cosa * uv.y + sina * uv.x
|
||||
) + pivot;
|
||||
}
|
||||
|
||||
|
||||
float circle(vec2 uv, float value)
|
||||
{
|
||||
float d = length(uv);
|
||||
float t = smoothstep(
|
||||
inner_radius + blur,
|
||||
inner_radius - blur,
|
||||
d
|
||||
) - smoothstep(
|
||||
outer_radius + blur,
|
||||
outer_radius - blur,
|
||||
d
|
||||
);
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
|
||||
void fragment(){
|
||||
float d = length((UV-0.5)*2.0);
|
||||
float t = pow(smoothstep(0.9,0.2,d),0.35);
|
||||
vec2 uv = (UV * 2.0) - 1.0;
|
||||
|
||||
vec3 rainbow = 0.5*cos(TIME+UV.xyx+vec3(0,2,4));
|
||||
vec4 color = vec4(rainbow.rgb,1.0);
|
||||
vec2 origin = vec2(0.0, 0.0);
|
||||
color = vec4(color_signal.rgb,1.0);
|
||||
uv = rotate_uv(uv, origin, turn * TAU);
|
||||
float c = circle(uv, 0.5);
|
||||
float mask = mask(uv, fill_ratio);
|
||||
d = sin(zoom*d - speed*TIME);
|
||||
//d = abs(d);
|
||||
d = size/d;
|
||||
color *= d*t;
|
||||
|
||||
COLOR = vec4(color * mask * c);
|
||||
}
|
||||
Reference in New Issue
Block a user