Pip3D
Pip3D — экспериментальный программный 3D-движок для ESP32-S3 и небольших дисплеев, в том числе ST7789 с разрешением 320×240. Поскольку рендеринг выполняет CPU без аппаратного GPU, обработка кадра и обновление экрана рассчитаны на ограниченные ресурсы микроконтроллера.
Движок объединяет программный рендерер, граф сцены и базовые средства управления камерой и столкновениями. Здесь проследим путь от буфера кадра до интерфейса поверх сцены и разберём, как часть вычислений распределяется между ядрами ESP32-S3.
Графика и рендеринг
Фреймбуфер и вывод кадра
Каждый кадр собирается в выровненном буфере RGB565 и передаётся драйверу ST7789 через DMA. Если изображение изменилось целиком, обновляется весь экран; для небольших изменений dirty-region механизм ограничивает перерисовку затронутыми участками. Тайловая обработка помогает работать с кадром по частям и контролировать расход памяти.
Z-буфер и растеризация
Расчёты и растеризация треугольников выполняются на CPU. Z-буфер задаёт порядок перекрытия поверхностей, а тайловый рендеринг делит работу на небольшие области. Так движок ограничивает объём промежуточных данных и укладывается в бюджет памяти микроконтроллера.
Освещение и шейдинг
В RGB565 меньше уровней цвета, чем в обычном desktop-рендере, поэтому Pip3D сочетает несколько составляющих света: ambient задаёт общий уровень, diffuse и specular реагируют на источник света, а rim-lighting подчёркивает края объектов.
Гамма-коррекция и ordered dithering сглаживают переходы между ограниченными значениями RGB565 и уменьшают заметность цветовых полос. Это помогает сохранить объёмное освещение без увеличения размера буфера кадра.
Процедурное небо
Небо рассчитывается по аналитической модели, без больших текстур. Контроллер времени суток меняет цвета горизонта, зенита и основного источника света, позволяя сцене переходить от рассвета к дневному свету и закату.
Сцена и движение
Граф сцены
Сцена описывается иерархическим графом: меши, источники света и камеры представлены узлами, которые наследуют преобразования родителей. Когда перемещается родительский объект, связанные элементы следуют его трансформации — матрицы не нужно вручную пересчитывать для каждого из них.
Камеры и анимация
Камеры поддерживают перспективную, ортографическую и fish-eye проекции. Таймлайн ключевых кадров позволяет задавать движение камеры в демонстрационных сценах, а классы FreeCam и OrbitCam дают готовые варианты свободного перемещения и вращения вокруг объекта.
Столкновения и физика
Физическое ядро проверяет столкновения AABB-объектов и сфер, а также обрабатывает базовую гравитацию и отскоки. Оно рассчитано на простые взаимодействия в сцене и не пытается выполнять тяжёлое моделирование импульсов.
Производительность и интерфейсные слои
Математика рендерера
Для расчётов на CPU используется собственный слой векторной и матричной математики. Быстрые приближения для синуса, косинуса и обратного квадратного корня сокращают стоимость повторяющихся операций в цикле рендеринга.
2D-интерфейс и оверлеи
Поверх 3D-сцены работает отдельный 2D-слой для текста, метрик вроде FPS и времени кадра, а также элементов интерфейса. Он использует ту же систему обновления изменённых областей, поэтому меню или прицел можно перерисовать отдельно от всей сцены.
Параллельные задачи
У ESP32-S3 два ядра, и система задач Pip3D позволяет передавать часть вычислений на второе, когда их можно выполнять параллельно с рендерингом.
Например, расчёт физики, обновление частиц FX или подготовку матричных данных можно вынести в отдельные задачи. Это распределяет работу между ядрами вместо того, чтобы выполнять все расчёты внутри цикла отрисовки.
Полное описание API находится в Документация Pip3D.