Dagon
Dagon — это мой движок для разработки 3D-игр, основанный на OpenGL 4.0 и SDL2. Полный список возможностей см. ниже.
Сайт проекта: https://gecko0307.github.io/dagon
Исходники: https://github.com/gecko0307/dagon
Демонстрационное приложение: https://github.com/gecko0307/dagon-sandbox
Если вы заинтересованы в развитии этого проекта, поддержите его на Patreon: https://www.patreon.com/gecko0307, либо сделайте разовое пожертвование криптовалютой через NOWPayments. Все, кто пожертвует $10 и выше, будут перечислены в списке спонсоров на этой странице, в репозитории Dagon, а также на сайте движка. Заранее благодарен!
Спонсоры проекта: Daniel Laburthe, Rafał Ziemniewski, Kumar Sookram, Александр Ковалев, Robert Georges, Jan Jurzitza (WebFreak), Раис Сафиуллин (SARFEX), Benas Cernevicius, Koichi Takio, Константин Меньшиков. Огромное спасибо за вашу поддержку!
Отдельное спасибо контрибьюторам Rafał Ziemniewski, Mateusz Muszyński, Denis Feklushkin, Björn Roberg, Konstantin Menshikov, Vlad Davydov, Viktor M., Ilya Lemeshko, а также Lawrence Aberba, Andrey Penechko, Elias Batek, Adrien Allard, Dennis Korpel, Robert Schadek, Ferhat Kurtulmuş, enjoysmath, Isaac S., flashburns за багрепорты и полезные идеи.






Список возможностей
На сегодняшний день Dagon включает следующие особенности и возможности:
- Ядро движка имеет минимум сторонних зависимостей — основано на OpenGL 4.0, SDL2, SDL2_Image и FreeType
- Виртуальная файловая система
- Встроенная поддержка моделей в форматах glTF 2.0 и OBJ, поддержка FBX и множества других форматов через библиотеку Assimp
- Скелетная анимация, GPU-скиннинг
- Поддержка всех популярных форматов изображений: PNG, JPG, WebP, AVIF, TGA, BMP, HDR, DDS, KTX, KTX2, SVG. Для DDS и KTX поддерживаются форматы сжатия S3TC, RGTC, BPTC, ASTC, для KTX2 — транскодирование из Basis Universal в S3TC или BPTC в зависимости от выбранного профиля. SVG-изображения растеризуются в выбранное разрешение
- Поддержка воспроизведения видео при помощи библиотеки libVLC
- HDR-рендеринг с поддержкой операторов тональной компрессии ACES, Filmic, Uncharted, Reinhard, Unreal, AgX
- Отложенный рендеринг с использованием прокси-геометрии (световых объемов). Неограниченное (fillrate-bound) количество локальных источников света. Прозрачные объекты рисуются в прямом режиме поверх непрозрачной геометрии с фиксированным набором локальных источников света
- Сферические и трубчатые объемные источники света
- Направленные и конусные источники света
- Каскадные теневые карты (cascaded shadow maps) для направленных источников света, поддержка мягких теней (PCF)
- Эффект объемных лучей (volumetric light) для направленного света
- Normal mapping, parallax mapping, parallax occlusion mapping
- PBR (roughness/metallic workflow), GGX BRDF
- IBL при помощи кубических и равнопромежуточных HDR-карт окружения. Загрузка кубических карт из файлов DDS и KTX / KTX2
- Отложенные декали с поддержкой PBR
- Процедурное динамическое небо с солнцем по модели Рэлея
- Рендеринг ландшафтов с поддержкой шума OpenSimplex для карт высот
- Система частиц с поддержкой векторных полей, мягкие частицы, освещаемые частицы, тени от частиц
- Постобработка, встроенные фильтры SSAO, FXAA, Motion Blur, Glow, Lens Distortion, Color Grading, цветокоррекция на основе 3D-таблиц Hald CLUT
- Рендеринг текста в кодировке UTF-8 с использованием TTF-шрифтов
- Модель сущностей и компонентов (entity-component), позволяющая расширять функциональность объектов динамически, без наследования классов
- Ввод с клавиатуры, мыши и геймпада. Поддержка вибрации и горячего подключения геймпадов
- Система событий
- Встроенный логгер
- Файлы конфигурации
- Поддержка GUI на основе тулкита ImGui
- Встроенный простой GUI для отладочного вывода
- Физика на основе движка Newton Dynamics. Встроенный контроллер персонажа
- Загрузка ресурсов из архивов при помощи библиотеки PhysFS
- Встроенная логика для камеры от первого лица (first person view) и свободного просмотра сцены (freeview).
Начало работы
Dagon устанавливается пакетным менеджером DUB. Проще всего начать работу с шаблона, создаваемого командой dub init
:
dub init --type=dagon
dub build
Эта команда создаст минимальный проект с простой сценой (плоскость и куб).
Документация
Примеры использования
Игры и приложения, сделанные при помощи Dagon:
- DagoBan — клон Sokoban
- Dagon-shooter — скроллинг шутер в разработке
- sacengine — свободная реализация движка игры Sacrifice.
Примеры:
- Коллекция базовых примеров
- Сцена Sponza
- Проверка столкновений с ландшафтом
- Управление от третьего лица
- Физика автомобиля
- Физика веревки (интегрирование Верле)
- 3D-звук
История
Проект стартовал в конце 2016 года, когда я начал переписывать свой предыдущий движок DGL на новую, более продуманную архитектуру. При этом совместимость с DGL была полностью утрачена, поэтому я решил, что движок будет носить новое название. Основная концепция, которая была заложена в Dagon с самого начала — модель памяти на основе владения (ownership). В D нет встроенного владения, но его относительно нетрудно добавить для классов — в итоге в dlib появился модуль dlib.core.ownership с базовым классом Owner
. Все объекты в Dagon основаны на нем. То есть, любой объект в движке может быть как владельцем, так и собственностью другого объекта, а вся структура приложения представляет собой одно большое дерево ресурсов. Это позволяет полностью автоматизировать высвобождение памяти, так как время жизни объектов детерминировано и в каждом конкретном случае определяется логикой того или иного компонента. Например, все ресурсы, ассоциированные со сценой, высвобождаются при удалении самой сцены. Передачу владения я делать не стал, так как считаю эту фичу сомнительным и не особо нужным в геймдеве усложнением основной идеи.
DGL был довольно хаотичным нагромождением классов-оберток над функциями OpenGL, Dagon же стал более цельным фреймворком. Он не просто облегчает работу с OpenGL, а предоставляет ресурсную модель приложения и асинхронную систему событий, при помощи которой несвязанные между собой объекты могут общаться посредством передачи сигналов (нечто похожее на модель акторов). В настоящее время Dagon поддерживает различные механизмы расширений — от кастомных компонентов для сущностей до кастомных рендер-пайплайнов, заменяющих встроенный.
Практически сразу, осенью 2017 года, Dagon был переписан на OpenGL 3.3, избавившись от тяжелого наследия фиксированного конвейера. Некоторое время движок использовал кластерный forward-рендер, в 2018 году перешел на deferred. Ядром рендера в движке стал PBR, который прошел солидный путь развития и за годы обзавелся множеством разнообразных фич, таких как HDR, subsurface scattering, volumetric lighting, area lights, декали, световые зонды и др. Также в 2018 году Dagon перешел на BindBC для динамической линковки C-библиотек.
В 2018 году на основе Dagon была написана свободная реализация игры Sacrifice — sacengine.
В 2019 году к проекту примкнули новые разработчики. Mateusz Muszyński добавил поддержку GUI-тулкита Nuklear. Стараниями Rafał Ziemniewski была реализована поддержка ландшафтов, загружаемых из карты высот, либо генерируемых шумом OpenSimplex. В этот период я начал работу по интеграции физического движка Newton. Также в этом году вышла игра, написанная с целью демонстрации возможностей Nuklear в Dagon — это DagoBan, мини-клон Sokoban со встроенным редактором уровней.
В 2020 году был значительно переписан рендер, он приобрел форму, в которой существует сегодня. Стало возможно написать свой собственный рендер-пайплайн и подключить его к приложению. Появилась поддержка текстур DDS.
2021 год ознаменовался поддержкой glTF 2.0, который постепенно заменил собой старый кастомный формат сцен в движке. Dagon хорошо совместим с glTF, экспортируемыми из Blender. Также появились поддержка кубических карт DDS и новые эффекты пост-процессинга.
В 2022 году была полностью переписана система загрузки текстур в движке — теперь она меньше зависит от dlib.image и позволяет создавать текстуры напрямую из буферов в памяти, без промежуточных объектов SuperImage
. Появилась поддержка тулкита ImGui, а также новая система текстурирования ландшафта. В этом же году я написал на Dagon демку с симулятором автомобиля.
2023 год — в движке дебютируют 1D- и 3D-текстуры, поддержка Hald CLUT, подповерхностное рассеивание, световые зонды.
2024 год — новый тонмаппер AgX, поддержка Wayland под Linux, улучшенный загрузчик OBJ. Dagon был упомянут на конференции FOSDEM ’24 в Брюсселе в рамках доклада по языку D. Также интервью со мной вышло в издании «Вечерняя Казань».
2025 год — огромное количество улучшений в движке. Вот лишь наиболее важные: поддержка GPU-скиннинга и анимированных моделей glTF (спасибо Денису Феклушкину за реализацию базовых классов, необходимых для анимации); переход на SDL2_Image для загрузки текстур, что обеспечило поддержку новых форматов — WebP, AVIF, SVG и многих других; поддержка текстур в формате KTX/KTX2 с транскодированием Basis Universal в различные профили сжатия; поддержка видеотекстур с декодированием на основе библиотеки libVLC; префильтрация кубических карт; бокс-проекция для зондов карт окружения; упрощенный рендер SimpleRenderer для казуальных игр и ретро-графики; встроенный движок проверки столкновений; собственный логгер; простой GUI-тулкит. Также у Dagon наконец-то появилась онлайн-документация.
Публикации
- В рамках доклада «The D Programming Language for Modern Open Source Development» / Mike Shah (Northeastern University KCCSFP, USA) / FOSDEM ’24 (Брюссель, 2024) / с. 42-43
- В рамках доклада «How DLang Improves my Modern C++ and Vice Versa» / Mike Shah (Northeastern University KCCSFP, USA) / ACCU Conference 2024 (Ассоциация пользователей C и C++, Бристоль, 2024) / с. 49
- В рамках доклада «The Case for Graphics Programming in Dlang» / Mike Shah (Northeastern University KCCSFP, USA) / DConf Online 2024 / с. 52
- «Графическим движком казанского художника пользуются гейм-разработчики всего мира» / Ольга Юхновская, «Вечерняя Казань», 2024