Dagon — это мой движок для разработки 3D-игр, основанный на OpenGL 4.0 и SDL2. Написан на языке D. Полный список возможностей см. ниже.

Сайт проекта: https://gecko0307.github.io/dagon
Исходники: https://github.com/gecko0307/dagon

Если вы заинтересованы в развитии этого проекта, поддержите его на 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
  • Переключение видеорежимов без перезагрузки, растягивание окна во время игры
  • Виртуальная файловая система. Поддержка библиотеки PhysFS для загрузки ресурсов из архивов
  • Встроенная поддержка моделей в форматах 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, Khronos PBR Neutral)
  • Отложенный рендеринг с использованием прокси-геометрии (световых объемов). Неограниченное (fillrate-bound) количество локальных источников света. Прозрачные объекты рисуются в прямом режиме поверх непрозрачной геометрии с фиксированным набором локальных источников света
  • Несколько типов источников света: параллельные, сферические, трубчатые, конусные
  • Каскадные теневые карты (CSM) для параллельных источников света, поддержка мягких теней (PCF). Для позиционных источников — тени методом двойного параболоида (DPSM), для конусных — перспективные тени (PSM)
  • Эффект объемного рассеивания (volumetric light scattering) для параллельного света
  • Эффекты normal mapping, parallax mapping, parallax occlusion mapping
  • PBR (roughness/metallic workflow), GGX BRDF
  • IBL при помощи кубических и равнопромежуточных HDR-карт окружения. Префильтрация кубических карт. Загрузка кубических карт c mip-уровнями из файлов DDS и KTX / KTX2
  • Отложенные декали с поддержкой PBR
  • Процедурное динамическое небо с солнцем по модели Рэлея (Rayleigh scattering)
  • Рендеринг ландшафтов с поддержкой шума OpenSimplex для карт высот
  • Рендеринг воды. Волны Герстнера
  • Система частиц с поддержкой векторных полей. Мягкие частицы, освещаемые частицы, тени от частиц
  • Постобработка, встроенные фильтры SSAO, FXAA, motion blur, glow, lens distortion, color grading, цветокоррекция на основе 3D-таблиц Hald CLUT. Эффекты ретро-рендеринга (снаппинг вершин, пикселизация) для создания игр с графикой в стиле 90-х
  • Рендеринг текста с использованием FreeType. Поддержка любых символов Юникода — динамическая подгрузка глифов из файла шрифта
  • Модель сущностей и компонентов (ECS), позволяющая расширять функциональность объектов динамически, без наследования классов
  • Система событий. Ввод с клавиатуры, мыши и геймпада. Поддержка вибрации и горячего подключения геймпадов. Под Windows — поддержка ввода с Wintab-совместимых графических планшетов
  • Микросервисы и worker-потоки для запуска фоновых задач без блокировки основного цикла игры. Асинхронный межпоточный обмен сообщениями
  • Логгер
  • Файлы конфигурации
  • Поддержка GUI на основе тулкита ImGui + встроенный простой GUI для отладочного вывода и добавления внутриигровой консоли
  • Поддержка локализации приложений
  • Проверка столкновений для выпуклых тел на основе алгоритма Minkowski Portal Refinement
  • Физика на основе движка Newton Dynamics. Встроенный контроллер персонажа
  • Интегрирование Верле для симуляции веревок и цепей
  • Встроенная логика для камеры от первого лица (first person view) и свободного просмотра сцены (freeview).

Начало работы

Dagon устанавливается пакетным менеджером DUB. Проще всего начать работу с шаблона, создаваемого командой dub init:

dub init --type=dagon
dub build

Эта команда создаст минимальный проект с простой сценой (плоскость и куб).

Документация

Примеры использования

Игры и приложения, сделанные при помощи Dagon:

  • DagoBan — клон Sokoban
  • Dagon-shooter — скроллинг шутер в разработке
  • sacengine — свободная реализация движка игры Sacrifice.

Примеры:

История

Проект стартовал в конце 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 в различные профили сжатия, а также сохранение в KTX2; поддержка видеотекстур с декодированием на основе библиотеки libVLC; поддержка анизотропной фильтрации текстур; тени для позиционных источников света; префильтрация кубических карт; бокс-проекция для зондов карт окружения; упрощенный рендер SimpleRenderer для казуальных игр и ретро-графики; шейдер океана; встроенный движок проверки столкновений; собственный логгер; простой GUI-тулкит; поддержка локализации приложений. Также у Dagon наконец-то появилась онлайн-документация.

Публикации