Эксперименты с шейдерами. Цель - достичь красоты. Умеет работать с шейдерами, звуками и взаимодействиями.
  • Rust 70.3%
  • WGSL 29.7%
Find a file
2026-07-12 03:33:02 +03:00
shaders Textures and variables 2026-07-12 03:33:02 +03:00
src Textures and variables 2026-07-12 03:33:02 +03:00
.gitignore Project created 2026-07-12 02:24:57 +03:00
AGENTS.md Textures and variables 2026-07-12 03:33:02 +03:00
Cargo.lock Textures and variables 2026-07-12 03:33:02 +03:00
Cargo.toml Textures and variables 2026-07-12 03:33:02 +03:00
err.log Add shaders, add export option and inf time 2026-07-12 02:49:09 +03:00
out.log Add shaders, add export option and inf time 2026-07-12 02:49:09 +03:00
README.md Textures and variables 2026-07-12 03:33:02 +03:00

🌱 Shader Garden

Оффлайн-вьюер шейдеров на Rust (wgpu + egui + cpal). По сути — локальный Shadertoy: кидаешь папку с WGSL-шейдером (и, если хочешь, с процедурным звуком «кодом») в shaders/, открываешь приложение и любуешься. Любой ИИ-агент может писать сюда шейдеры по инструкции в AGENTS.md.

Возможности

  • 🎨 Просмотр WGSL-шейдеров (Shadertoy-подобный контракт: функция mainImage).
  • 🔊 Звук кодом — процедурное аудио через mainSound, считается на GPU compute-шейдере.
  • 🗂 Каждый шейдер в своей папке: shaders/<имя>/{image.wgsl, meta.toml, sound.wgsl}.
  • 🖥 Выбор видеокарты — список всех GPU в системе (применяется после перезапуска).
  • 🎚 Ограничение FPS — слайдер 10…240 или без лимита (для тяжёлых шейдеров).
  • 🎛 Типизированные переменные ([[uniform]]): float/int/bool/vec/color с авто-виджетами (слайдеры, цвет-пикеры, чекбоксы), читаются в WGSL как u_<имя>().
  • 🖼 Импорт текстур ([[channel]]): png/jpg из папки шейдера, сэмплируются через ch_<имя>(uv).
  • 🖱 Ввод для шейдеров: позиция мыши, клики, скролл — через G.mouse и G.input.
  • 🎥 Запись видео — MP4 (H.264 + AAC, до 4K, любой длительности) через ffmpeg или GIF-фолбэк. Звук шейдера (mainSound) попадает в MP4. Два режима: «клип» (детерминированный рендер точной длины) и «вживую» (пишет реальное взаимодействие мышью/клавиатурой до ручной остановки). Файлы → recordings/.
  • ⏯ Пауза, рестарт, скорость времени, скраббинг по времени.
  • ♻️ Горячая перезагрузка: правишь .wgsl — картинка обновляется на лету.
  • 🧯 Ошибки компиляции показываются прямо в окне (с номерами строк).

Запуск

Нужен установленный Rust (стабильный).

cargo run --release

Запускать из корня проекта (где лежит папка shaders/). Приложение ищет шейдеры в ./shaders, а настройки пишет в ./shader_garden_config.toml.

Для записи MP4 нужен ffmpeg в PATH (проверка: ffmpeg -version). Без него запись MP4 недоступна, но GIF работает всегда. MP4 поддерживает разрешение до 3840×2160 (4K) и любую длительность (кадры стримятся в ffmpeg, память не растёт).

Структура

shader-garden/
├─ Cargo.toml
├─ AGENTS.md              ← инструкция для ИИ, пишущих шейдеры
├─ README.md
├─ src/
│  ├─ main.rs             ← eframe-приложение, GUI, выбор GPU
│  ├─ gpu.rs              ← рендер-пайплайн, обёртка WGSL, валидация (naga)
│  ├─ audio.rs            ← GPU-синтез звука + вывод через cpal
│  ├─ library.rs          ← сканирование папки shaders/
│  └─ config.rs           ← сохранение настроек
└─ shaders/
   ├─ 01_plasma/          ← плазма + звук + параметры
   ├─ 02_aurora/          ← северное сияние
   ├─ 03_raymarch/        ← raymarching-тор (пример 3D)
   ├─ 13_uniforms/        ← типизированные переменные (цвет/слайдер/чекбокс)
   ├─ 14_texture/         ← импорт png-текстуры (ch_tex)
   ├─ 10_ripples/         ← рябь от курсора (мышь + ЛКМ)
   └─ 11_julia/           ← множество Жюлиа (скролл = зум, мышь = форма)

Как добавить свой шейдер

  1. Создай папку shaders/my_shader/.
  2. Положи image.wgsl с функцией mainImage(frag: vec2<f32>) -> vec4<f32>.
  3. (Необязательно) добавь meta.toml и sound.wgsl.
  4. Нажми «⟳ Обновить» в приложении или просто выбери шейдер — он подхватится.

Полный контракт (доступные переменные, правила, примеры, отличия WGSL от GLSL) — в AGENTS.md.

Замечания по версиям

Код рассчитан на согласованный набор: eframe/egui/egui-wgpu 0.31, wgpu 24, naga 24 (см. Cargo.toml). Если при сборке возникнет несоответствие API — держи весь этот набор в одной мажорной версии, а не бампай одну крейту отдельно.

Смена видеокарты применяется при следующем запуске (приложение не пересоздаёт устройство на лету — так надёжнее).