Система визуализации частиц в реальном времени с GPU-ускорением, двумя рендер-бекендами и физическим движком XPBD на Rust/WASM
GPU Particle Shapes -- система визуализации частиц в реальном времени с двумя рендер-бекендами: стабильным WebGL2 и экспериментальным WebGPU с трассировкой лучей. Физика реализована собственным движком XPBD на Rust, скомпилированным в WebAssembly.
Система обеспечивает рендеринг 65 000+ частиц при 60 FPS, морфинг между 13 математическими формами, 7 режимов взаимодействия с курсором, аудиореактивность и физически корректное освещение (PBR).
| Версия | Ссылка | Описание |
|---|---|---|
| WebGL2 (стабильная) | Открыть | Полнофункциональная версия, все современные браузеры |
| WebGPU (экспериментальная) | Открыть | Трассировка лучей, Chrome 113+ |
- GPU-ускорение через GPGPU: Multiple Render Targets, ping-pong текстурные буферы
- Текстуры с плавающей запятой RGBA32F для хранения состояния частиц (позиция + скорость)
- Физически корректный рендеринг (PBR): Cook-Torrance BRDF, Fresnel-Schlick, GGX NDF
- До 8 динамических источников света
- HDR-рендеринг с тональным отображением ACES
- Постобработка Bloom
- 65 000+ частиц (текстура до 384x384)
- Трассировка лучей в реальном времени с BVH-ускорением
- Глобальное освещение методом трассировки путей (1-bounce GI)
- Индивидуальные PBR-материалы для каждой частицы (albedo, roughness, metallic, emissive)
- Importance sampling на основе GGX-распределения
- Временное шумоподавление через экспоненциальное скользящее среднее
- Конвейер: Симуляция -> BVH -> Трассировка лучей -> Временная аккумуляция -> Вывод
| Категория | Формы |
|---|---|
| Базовые | Cube, Sphere |
| Криволинейные | Torus, Helix |
| Многогранники | Octahedron, Icosahedron |
| Параметрические | Superformula, Rose, Wave |
| Комплексные | Ribbon, Polygon |
| Специальные | Fractal, Equalizer |
| Режим | Описание |
|---|---|
| Shapes | Морфинг между математическими формами |
| Free Flight | Свободное движение частиц в пространстве |
| Fractals | Эмерджентные фрактальные паттерны |
| Режим | Описание |
|---|---|
| Attract | Притяжение частиц к курсору |
| Repel | Отталкивание частиц от курсора |
| Vortex Left | Вихрь против часовой стрелки |
| Vortex Right | Вихрь по часовой стрелке |
| Pulse | Пульсирующие волны от курсора |
| Magnetic Flow | Магнитный поток |
| Quasar | Квазароподобное выбрасывание частиц |
- Анализ частотного спектра в реальном времени (bass, mid, treble, energy)
- Частицы реагируют на аудиовход
- Режим визуализации Equalizer
- Солвер Extended Position Based Dynamics с подшагами и итерациями Якоби
- 5 типов ограничений: distance, contact, density (PBF), shape matching, bending
- N-body гравитация Barnes-Hut (O(N log N), октодерево)
- Электромагнитные силы (Кулон + Лоренц)
- PBF плотность + XSPH вязкость + vorticity confinement
- Пространственная хеш-сетка для O(N) поиска соседей
- Адаптивный контроллер качества (бюджетное масштабирование подшагов/итераций)
- Морфинг форм как XPBD-ограничения позиции с переменной податливостью
- 154 теста, ноль предупреждений
- Опциональная параллелизация через rayon
- Панель управления: формы, цвета, морфинг, курсор, частицы, аудио
- Двуязычный интерфейс (EN/RU через i18n)
- Адаптивный дизайн для мобильных устройств
- Камера: правая кнопка мыши + перетаскивание (вращение), колесо прокрутки (масштаб)
- Node.js -- для npm и dev-сервера
- Rust toolchain + wasm-pack -- для сборки физического движка в WASM
- Современный браузер -- WebGL2 для стабильной версии, Chrome 113+ для WebGPU
# Клонирование репозитория
git clone https://github.com/4RH1T3CT0R7/GPU-particles-web.git
cd GPU-particles-web
# Установка зависимостей
npm install
# Полная сборка (WASM + TypeScript) и запуск dev-сервера
npm run devDev-сервер запускается на http://localhost:8080 с заголовками COOP/COEP (необходимы для SharedArrayBuffer и WASM).
- WebGL2:
http://localhost:8080/index.html - WebGPU:
http://localhost:8080/index-webgpu.html
| Команда | Описание |
|---|---|
npm run build |
Полная сборка: WASM + TypeScript |
npm run build:wasm |
Сборка Rust в WASM (release) |
npm run build:wasm:debug |
Сборка WASM (debug) |
npm run build:ts |
Бандлинг TypeScript через esbuild |
npm run build:watch |
Пересборка TS при изменениях |
npm run dev |
Сборка + dev-сервер на localhost:8080 |
npm run typecheck |
Проверка типов TypeScript |
npm run test:rust |
Запуск тестов Rust (154 теста) |
npm run bench:rust |
Запуск бенчмарков Rust |
GPU-particles-web/
├── index.html # WebGL2 версия (стабильная)
├── index.ts # WebGL2 точка входа (TypeScript)
├── index-webgpu.html # WebGPU версия (трассировка лучей)
├── index-webgpu.ts # WebGPU точка входа (TypeScript)
├── debug.html # WebGL2 диагностика
├── debug-webgpu.html # WebGPU диагностика
├── serve.mjs # Dev-сервер (Node.js, COOP/COEP)
├── package.json # npm-конфигурация и скрипты
├── tsconfig.json # Конфигурация TypeScript
├── README.md
├── ROADMAP.md
├── WEBGPU_SETUP.md
├── START_LOCAL.md
├── LIGHTING_REPORT.md
├── LICENSE.md
├── dist/ # Собранный JS
│ ├── index.js
│ └── index-webgpu.js
├── wasm/pkg/ # Скомпилированный WASM
├── physics/ # Физический движок Rust XPBD
│ ├── Cargo.toml # Корень workspace
│ └── crates/
│ ├── xpbd-core/ # Чистый Rust (без WASM-зависимостей)
│ │ ├── src/
│ │ │ ├── lib.rs
│ │ │ ├── solver.rs # Цикл солвера XPBD
│ │ │ ├── particle.rs # ParticleSet, Phase enum
│ │ │ ├── config.rs # PhysicsConfig
│ │ │ ├── grid.rs # Пространственная хеш-сетка
│ │ │ ├── math.rs # Математические утилиты
│ │ │ ├── quality.rs # Адаптивное качество
│ │ │ ├── materials.rs # Пресеты материалов
│ │ │ ├── constraints/ # distance, contact, density, shape_matching, bending
│ │ │ ├── forces/ # gravity, electromagnetic, pointer, audio, flow
│ │ │ ├── shapes/ # primitives, fractal, morph, dispatcher
│ │ │ └── fluids/ # viscosity, vorticity
│ │ └── tests/ # 154 теста
│ └── xpbd-wasm/ # WASM-привязки (wasm-bindgen)
│ └── src/lib.rs # PhysicsWorld API
└── src/ # Исходники TypeScript
├── types.ts # Общие определения типов
├── app/lights.ts # Конфигурация динамического освещения
├── audio/analyzer.ts # Анализ аудиочастот
├── camera/controls.ts # 3D-камера (орбита, масштаб)
├── config/
│ ├── constants.ts # Константы, палитры, формы
│ ├── physics.ts # Параметры физики
│ └── rendering.ts # PBR, bloom, экспозиция
├── core/
│ ├── utils.ts # WebGL-хелперы (VAO, FBO, текстуры)
│ └── webgl.ts # Инициализация WebGL2-контекста
├── gpu/
│ ├── device.ts # Инициализация WebGPU adapter/device
│ ├── pipelines.ts # Оркестрация пайплайнов
│ └── pipelines/ # blit, bvh, raytracing, simulation, temporal
├── physics/wasm-loader.ts # Интеграция WASM-физики
├── rendering/pipeline.ts # Render targets, bloom, HDR
├── shaders/ # GLSL-шейдеры (WebGL2)
│ ├── common.ts, particle.ts, pbr.ts, bloom.ts, blit.ts
│ ├── simulation.ts, init.ts
│ └── shapes.ts, shapes-primitives.ts, shapes-fractal.ts, shapes-dispatcher.ts
├── simulation/state.ts # GPU-буферы частиц
├── ui/
│ ├── controls.ts # Главная настройка UI
│ ├── controls/ # shapes, colors, cursor, particles, audio
│ ├── i18n.ts # Интернационализация (EN/RU)
│ └── mobile.ts # Мобильное меню
└── wgsl/ # WGSL-шейдеры (WebGPU)
├── shaders.ts
└── snippets.ts
| Слой | Технологии |
|---|---|
| Приложение | TypeScript 5.9, esbuild |
| Рендеринг (стабильный) | WebGL2, GLSL ES 3.0 |
| Рендеринг (экспериментальный) | WebGPU, WGSL |
| Физика | Rust, glam 0.29, bytemuck, rayon |
| WASM-мост | wasm-pack, wasm-bindgen |
| Dev-инфраструктура | Node.js, serve.mjs (порт 8080) |
Инициализация текстур (RGBA32F)
|
v
[Ping-Pong буферы]
|
v
Вычисление физики (GPGPU через MRT)
|
v
PBR-освещение (Cook-Torrance BRDF)
|
v
Bloom постобработка
|
v
HDR -> ACES тональное отображение
|
v
Вывод на экран
Симуляция частиц (Compute Shader)
|
v
Построение BVH (Compute Shader)
|
v
Трассировка лучей + GI (Compute Shader)
|
v
Временная аккумуляция (Compute Shader)
|
v
Blit + тональное отображение (Render Pass)
Физический движок разделен на два крейта:
- xpbd-core -- чистая Rust-реализация без WASM-зависимостей. Содержит солвер, ограничения, силы, формы и пространственное хеширование. Может использоваться независимо.
- xpbd-wasm -- тонкий слой привязок через wasm-bindgen, экспортирующий
PhysicsWorldAPI для JavaScript.
Цикл солвера на каждом кадре:
- Внешние силы (гравитация, электромагнетизм, указатель, аудио, поток)
- Предсказание позиций
- Подшаги с итерациями Якоби:
- Ограничения расстояния
- Контактные ограничения
- Ограничения плотности (PBF)
- Shape matching
- Ограничения изгиба
- Обновление скоростей
- XSPH вязкость + vorticity confinement
- Обновление пространственной хеш-сетки
| Параметр | WebGL2 | WebGPU |
|---|---|---|
| Целевой FPS | 60 | 60 |
| Количество частиц | 65 000+ | 16 000 -- 65 000 |
| Рекомендуемый GPU | Любой с WebGL2 | RTX 3080+ |
| Разрешение | Любое | 1080p для стабильных 60 FPS |
| Физика | GPU (GPGPU) + WASM | GPU (Compute) + WASM |
| Браузер | Минимальная версия | Поддержка |
|---|---|---|
| Chrome | 56+ | Полная |
| Firefox | 51+ | Полная |
| Safari | 15+ | Полная |
| Edge | 79+ | Полная |
| Браузер | Минимальная версия | Поддержка |
|---|---|---|
| Chrome | 113+ | Полная |
| Firefox | -- | В разработке |
| Safari Technology Preview | -- | Частичная |
Проект включает специализированные страницы диагностики для каждого рендер-бекенда.
| Страница | Локально | На GitHub Pages |
|---|---|---|
| WebGL2 | http://localhost:8080/debug.html |
Открыть |
| WebGPU | http://localhost:8080/debug-webgpu.html |
Открыть |
WebGL2:
- Проверка доступности WebGL2-контекста
- Верификация расширений (EXT_color_buffer_float)
- Тестирование компиляции шейдеров
- Захват ошибок в реальном времени со стек-трейсами
WebGPU:
- Обнаружение adapter и device
- Инспекция возможностей и лимитов GPU
- Верификация загрузки шейдерных файлов
- Компиляция WGSL с детальными сообщениями об ошибках
- Перехват консольного вывода в UI-оверлее
| Проблема | Решение |
|---|---|
| WebGPU недоступен | Используйте Chrome 113+, проверьте chrome://flags/#enable-unsafe-webgpu |
| Ошибки 404 при загрузке шейдеров | Убедитесь, что сервер запущен из корня проекта |
| Ошибки компиляции WGSL | Проверьте диагностическую страницу для получения номеров строк |
| Низкий FPS в WebGPU | Требуется GPU с аппаратной трассировкой лучей |
| WASM не загружается | Пересоберите: npm run build:wasm |
# Запуск всех 154 тестов
npm run test:rust
# Или напрямую через cargo
cd physics
cargo testТесты покрывают: солвер XPBD, все типы ограничений, пространственное хеширование, N-body гравитацию, электромагнитные силы, генерацию форм, морфинг, адаптивное качество, конфигурацию и материалы.
npm run typechecknpm run bench:rust| Действие | Результат |
|---|---|
| Левая кнопка + перетаскивание | Применение эффекта курсора |
| Правая кнопка + перетаскивание | Вращение камеры |
| Колесо прокрутки | Масштабирование |
- Формы -- выбор целевой формы, переключение режимов рендеринга, автоматическая смена форм
- Цвета -- количество цветов в градиенте (2-6), случайная смена палитры
- Морфинг -- скорость перехода (4-30 секунд), сила притяжения к форме
- Курсор -- выбор режима взаимодействия, сила и радиус, пульс при нажатии
- Частицы -- количество частиц, множитель скорости, сброс и разброс
- Аудио -- включение аудиореактивности, выбор источника
Проект распространяется под лицензией MIT. Подробности в файле LICENSE.md.
4RH1T3CT0R7 -- GitHub
Репозиторий: https://github.com/4RH1T3CT0R7/GPU-particles-web