Dagon

Dagon — это мой фреймворк для разработки 3D-игр, основанный на OpenGL 4.3 и SDL2. Ядро движка написано на языке D. Список ключевых возможностей см. ниже.
Сайт проекта: https://gecko0307.github.io/dagon
Исходники: https://github.com/gecko0307/dagon
В 2026 году была выпущена первая стабильная версия движка, Dagon 1.0. В разработке вторая версия, которая будет на основе SDL3 с Vulkan-бэкендом.
Если вы заинтересованы в развитии этого проекта, поддержите его на 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 работает под Windows и Linux. Движок предназначен только для десктопа, поддержка других платформ не планируется.
Dagon использует ресурсоемкие графические технологии, поэтому для его работы требуется достаточно мощная видеокарта. Для оптимальной производительности рекомендуются видеокарты NVIDIA на базе архитектуры Ampere.
Рекомендуемые системные требования для рендеринга Full HD при 60 кадрах в секунду:
- Процессор Intel Core i3-10100 или AMD Ryzen 3 3100
- Оперативная память: зависит от приложения, обычно не менее 8 ГБ
- Видеокарта серии GeForce 30 или Radeon RX 6000
- Видеопамять: 8 ГБ
- ОС: 64-битная Windows 10 или выше / любой современный Linux-дистрибутив для десктопа.
Linux-сборки движка тестируются под Mint.
Список возможностей
На сегодняшний день Dagon включает следующие особенности и возможности:
- Граф сцены
- Виртуальная файловая система
- Статические и анимированные модели. Нативная поддержка форматов glTF 2.0, OBJ и IQM. Поддержка 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-изображения растеризуются в выбранное разрешение
- Встроенный компрессор DXT1/DXT5 и экспортер DDS
- Воспроизведение видео с использованием libVLC
- Работа в оконном, полноэкранном и безрамочном полноэкранном режимах. Поддержка HiDPI
- Гибридный рендер: deferred для непрозрачных материалов, forward для прозрачных материалов и материалов с пользовательскими шейдерами
- Физически обоснованный рендеринг (PBR) с использованием GGX BRDF (roughness/metallic workflow)
- HDR-рендеринг с поддержкой операторов тональной компрессии ACES, Filmic, Uncharted, Reinhard, Unreal, AgX и других. Поддержка автоэкспозиции
- IBL при помощи кубических и равнопромежуточных HDR-карт окружения. Префильтрация кубических карт на GPU, загрузка предварительно запеченных кубических карт из файлов DDS или KTX
- Неограниченное (fillrate-bound) количество точечных/объемных источников света
- Направленные источники света с каскадными тенями (CSM)
- Сферические и трубчатые источники света с тенями по методу двойного параболоида (DPSM)
- Конусные источники света с перспективными тенями (PSM)
- Поддержка объемного рассеивания света для всех типов источников. Анизотропное рассеивание Хеньи-Гринштейна для направленного света
- Локальные зонды освещения
- Normal mapping, parallax mapping, parallax occlusion mapping
- Отложенные декали с поддержкой PBR
- Процедурное динамическое небо с солнцем по модели Рэлея
- Система частиц с поддержкой силовых полей, мягкие частицы, освещаемые частицы, тени от частиц
- Рендеринг ландшафта. Ландшафт может быть сгенерирован на основе шума OpenSimplex или пользовательской карты высот. Отложенное текстурирование для ландшафтов
- Рендеринг воды. Реалистичный шейдер океана с волнами Герстнера
- Полный стек постобработки (антиалиасинг, depth of field, lens distortion, motion blur, glow, виньетирование, film grain, цветокоррекция, LUT, повышение резкости). Поддержка пользовательских фильтров постобработки
- Упрощенный конвейер рендеринга для нефотореалистичной графики. Поддержка ретро-рендеринга: пикселизация и снэппинг вершин
- Анимация (tweens, easing)
- Система событий. Ввод с клавиатуры, мыши и до 4 геймпадов. Поддержка вибрации и горячего подключения геймпадов. Ввод с графического планшета (только под Windows)
- Встроенный логгер
- Файлы конфигурации
- Модель владения (ownership) для автоматического управления памятью
- Модель сущностей и компонентов (ECS), позволяющая расширять функциональность объектов динамически, без наследования классов
- Вычислительные шейдеры
- Поддержка многопоточности для выполнения задач в фоновом режиме; асинхронный потоково-безопасный обмен сообщениями
- Обнаружение столкновений с использованием алгоритма MPR, трассировка лучей, простая кинематическая система реагирования на столкновения
- Физика с использованием движков Jolt Physics и Newton Game Dynamics. Встроенный контроллер персонажа
- Поддержка изометрических и двумерных игр
- Рендеринг текста в кодировке UTF-8 с использованием TTF-шрифтов
- Поддержка интернационализации приложений
- GUI на основе Dear ImGui
- Диалоги открытия/сохранения файлов (для Windows, GTK и Qt)
- Загрузка ресурсов из архивов при помощи библиотеки PhysFS
- Воспроизведение 2D/3D звука. Поддержка различных аудиоформатов, включая WAV, MP3, OGG/Vorbis, FLAC. Поддержка стерео, 5.1, 7.1
- Встроенная логика для камеры от первого лица (first person view) и свободного просмотра сцены (freeview).
Начало работы
Dagon устанавливается пакетным менеджером DUB. Проще всего начать работу с шаблона, создаваемого командой dub init:
dub init --type=dagon
dub build
Эта команда создаст минимальный проект с простой сценой (плоскость и куб).
Документация
Примеры использования
Игры и приложения, сделанные при помощи Dagon:
- DagoBan — клон Sokoban
- 2048×2 — клон 2048 для двух игроков
- 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 году была полностью переписана система загрузки текстур в движке — теперь она позволяет создавать текстуры напрямую из буферов в памяти, без промежуточных объектов SuperImage. Появилась поддержка тулкита ImGui, а также новая система текстурирования ландшафта. В этом же году я написал на Dagon демку с симулятором автомобиля.
2023 год — в движке дебютируют 1D- и 3D-текстуры, поддержка Hald CLUT, подповерхностное рассеивание, световые зонды.
2024 год — новый тонмаппер AgX, поддержка Wayland под Linux, улучшенный загрузчик OBJ. Dagon был упомянут на конференции FOSDEM ’24 в Брюсселе в рамках доклада по языку D. Также интервью со мной вышло в издании «Вечерняя Казань».
2025 год — огромное количество улучшений в движке. Вот лишь наиболее важные: переход на OpenGL 4.3, многопоточность и асинхронный обмен сообщениями, вычислительные шейдеры, поддержка GPU-скиннинга и анимированных моделей glTF (спасибо Денису Феклушкину за реализацию базовых классов, необходимых для анимации); поддержка HiDPI; поддержка устройств виртуальной реальности на основе API OpenVR; переход на SDL2_Image для загрузки текстур, что обеспечило поддержку новых форматов — WebP, AVIF, SVG и многих других; поддержка текстур в формате KTX/KTX2 с транскодированием Basis Universal в различные профили сжатия, а также сохранение в KTX2; поддержка видеотекстур с декодированием на основе библиотеки libVLC; звуковой движок; поддержка анизотропной фильтрации текстур; тени для позиционных источников света; префильтрация кубических карт; объемное рассеивание для позиционных источников света; бокс-проекция для зондов карт окружения; упрощенный рендер SimpleRenderer для казуальных игр и ретро-графики; шейдер океана; встроенный движок проверки столкновений; собственный логгер; простой GUI-тулкит; поддержка локализации приложений. Также у Dagon наконец-то появилась онлайн-документация.
2026 год — в апреле этого года вышел Dagon 1.0.0. Появилась интеграция физического движка Jolt Physics, поддержка объемных конусных источников света, встроенный компрессор DXT1/DXT5 и возможность сохранения текстур в DDS, новые тонмапперы Uchimura и Lottes, фильтр повышения резкости (CAS), автоэкспозиция, эффекты виньетирования и film grain. Также в этом году стартовала разработка Dagon 2.0 с рендером на основе SDL GPU. В новой версии движка был значительно улучшен рендер, реализована поддержка SSLR, добавлено сжатие в BC4 и BC7, FXAA 3.11 и поддержка HDR-дисплеев.
Публикации
- В рамках доклада «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