Pip3D

Pip3D — экспериментальный программный 3D-движок для ESP32-S3 и небольших дисплеев, в том числе ST7789 с разрешением 320×240. Поскольку рендеринг выполняет CPU без аппаратного GPU, обработка кадра и обновление экрана рассчитаны на ограниченные ресурсы микроконтроллера.

Движок объединяет программный рендерер, граф сцены и базовые средства управления камерой и столкновениями. Здесь проследим путь от буфера кадра до интерфейса поверх сцены и разберём, как часть вычислений распределяется между ядрами ESP32-S3.

Графика и рендеринг

Фреймбуфер и вывод кадра

Каждый кадр собирается в выровненном буфере RGB565 и передаётся драйверу ST7789 через DMA. Если изображение изменилось целиком, обновляется весь экран; для небольших изменений dirty-region механизм ограничивает перерисовку затронутыми участками. Тайловая обработка помогает работать с кадром по частям и контролировать расход памяти.

Визуализация фреймбуфера и тайлов

Z-буфер и растеризация

Расчёты и растеризация треугольников выполняются на CPU. Z-буфер задаёт порядок перекрытия поверхностей, а тайловый рендеринг делит работу на небольшие области. Так движок ограничивает объём промежуточных данных и укладывается в бюджет памяти микроконтроллера.

Рендеринг сцены с Z-буфером на дисплее ST7789

Освещение и шейдинг

В RGB565 меньше уровней цвета, чем в обычном desktop-рендере, поэтому Pip3D сочетает несколько составляющих света: ambient задаёт общий уровень, diffuse и specular реагируют на источник света, а rim-lighting подчёркивает края объектов.

Гамма-коррекция и ordered dithering сглаживают переходы между ограниченными значениями RGB565 и уменьшают заметность цветовых полос. Это помогает сохранить объёмное освещение без увеличения размера буфера кадра.

Освещение, тональная коррекция и дизеринг

Процедурное небо

Небо рассчитывается по аналитической модели, без больших текстур. Контроллер времени суток меняет цвета горизонта, зенита и основного источника света, позволяя сцене переходить от рассвета к дневному свету и закату.

Процедурное небо и цикл дня и ночи

Сцена и движение

Граф сцены

Сцена описывается иерархическим графом: меши, источники света и камеры представлены узлами, которые наследуют преобразования родителей. Когда перемещается родительский объект, связанные элементы следуют его трансформации — матрицы не нужно вручную пересчитывать для каждого из них.

Иерархия графа сцены и его узлов

Камеры и анимация

Камеры поддерживают перспективную, ортографическую и fish-eye проекции. Таймлайн ключевых кадров позволяет задавать движение камеры в демонстрационных сценах, а классы FreeCam и OrbitCam дают готовые варианты свободного перемещения и вращения вокруг объекта.

Движение камеры и ключевые кадры

Столкновения и физика

Физическое ядро проверяет столкновения AABB-объектов и сфер, а также обрабатывает базовую гравитацию и отскоки. Оно рассчитано на простые взаимодействия в сцене и не пытается выполнять тяжёлое моделирование импульсов.

Обработка столкновений в физическом ядре

Производительность и интерфейсные слои

Математика рендерера

Для расчётов на CPU используется собственный слой векторной и матричной математики. Быстрые приближения для синуса, косинуса и обратного квадратного корня сокращают стоимость повторяющихся операций в цикле рендеринга.

Быстрые математические приближения для 3D

2D-интерфейс и оверлеи

Поверх 3D-сцены работает отдельный 2D-слой для текста, метрик вроде FPS и времени кадра, а также элементов интерфейса. Он использует ту же систему обновления изменённых областей, поэтому меню или прицел можно перерисовать отдельно от всей сцены.

2D-интерфейс и метрики поверх 3D-сцены

Параллельные задачи

У ESP32-S3 два ядра, и система задач Pip3D позволяет передавать часть вычислений на второе, когда их можно выполнять параллельно с рендерингом.

Например, расчёт физики, обновление частиц FX или подготовку матричных данных можно вынести в отдельные задачи. Это распределяет работу между ядрами вместо того, чтобы выполнять все расчёты внутри цикла отрисовки.

Распределение задач между ядрами ESP32-S3

Полное описание API находится в Документация Pip3D.