- Rust 70.3%
- WGSL 29.7%
| shaders | ||
| src | ||
| .gitignore | ||
| AGENTS.md | ||
| Cargo.lock | ||
| Cargo.toml | ||
| err.log | ||
| out.log | ||
| README.md | ||
🌱 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/ ← множество Жюлиа (скролл = зум, мышь = форма)
Как добавить свой шейдер
- Создай папку
shaders/my_shader/. - Положи
image.wgslс функциейmainImage(frag: vec2<f32>) -> vec4<f32>. - (Необязательно) добавь
meta.tomlиsound.wgsl. - Нажми «⟳ Обновить» в приложении или просто выбери шейдер — он подхватится.
Полный контракт (доступные переменные, правила, примеры, отличия WGSL от GLSL) — в AGENTS.md.
Замечания по версиям
Код рассчитан на согласованный набор: eframe/egui/egui-wgpu 0.31, wgpu 24,
naga 24 (см. Cargo.toml). Если при сборке возникнет несоответствие API — держи весь
этот набор в одной мажорной версии, а не бампай одну крейту отдельно.
Смена видеокарты применяется при следующем запуске (приложение не пересоздаёт устройство на лету — так надёжнее).