Dagon

Dagon - это мой новый фреймворк для разработки 3D-игр, появившийся в результате переосмысления некоторых концепций DGL. В процессе работы над Atrium я пришел к выводу, что в движке не хватает средств автоматизации некоторых рутинных задач. Например, управление памятью в типичном игровом приложении может быть почти полностью автоматизировано, поскольку выделение и высвобождение памяти происходит в специально задуманных паузах, таких как переключение между локациями (это не относится к играм с открытым миром с фоновой подгрузкой, но это уже специфический случай). Кроме того, в обсуждении на Reddit звучал вопрос, почему DGL не использует SDL2. Так родилась новая ветка движка, которую я решил сделать отдельным экспериментальным проектом. Постепенно Dagon начал обрастать новыми возможностями, которых нет в DGL, а затем и вовсе был переписан под OpenGL 3.3. Движок все еще находится в активной разработке, но уже сейчас выдает, как мне кажется, неплохую современную картинку.

Исходники:
https://github.com/gecko0307/dagon

Демонстрационное приложение:
https://github.com/gecko0307/dagon-demo

Если вы заинтересованы в развитии этого проекта, поддержите его на Patreon: https://www.patreon.com/gecko0307. Все, кто пожертвует $10 и выше, будут перечислены в списке спонсоров на этой странице и в репозитории Dagon (а также на сайте движка, который я планирую сделать в ближайшем будущем).

Вы также можете сделать разовое пожертвование через PayPal: https://www.paypal.me/tgafarov. Заранее благодарен!


На сегодняшний день Dagon включает следующие особенности и возможности:
  • Использование OpenGL 4.0 и SDL2.
  • Поддержка форматов моделей OBJ и IQM.
  • Собственный формат сцен *.asset с экспортером для Blender. Используется для хранения мешей, объектов, материалов и текстур.
  • Поддержка текстур PNG, JPG, TGA, BMP, HDR.
  • Поддержка контейнера Box для ресурсов. Это простой несжатый архив, альтернатива TAR с использованием UTF-8 для имен файлов.
  • Скелетная анимация.
  • HDR-рендеринг с поддержкой автоматической экспозиции и операторов тональной компрессии ACES, Hable/Uncharted, Reinhard.
  • Отложенный рендеринг с использованием прокси-геометрии (световых объемов). Прозрачные объекты рендерятся в прямом режиме поверх непрозрачной геометрии, пока без учета точечных источников света.
  • Неограниченное (fillrate-bound) количество точечных/объемных источников света.
  • Сферические объемные источники света (Spherical Area Lights).
  • Каскадные теневые карты (cascaded shadow maps), мягкие тени с использованием PCF.
  • Normal mapping, parallax mapping, parallax occlusion mapping.
  • PBR (roughness/metallic workflow), Cook-Torrance BRDF.
  • Процедурное динамическое небо с солнцем.
  • HDR-карты окружения.
  • Система частиц с поддержкой векторных полей, тени от частиц.
  • Постобработка, встроенные фильтры SSAO, FXAA, Motion Blur, Glow, Lens Distortion, Color Grading.
  • Рендеринг текста в кодировке UTF-8 с использованием TTF-шрифтов.
  • Новая модель управления памятью на основе концепции владельца (owner), позаимствованной из Delphi. Любой объект может принадлежать другому: когда удаляется объект-владелец, удаляются и все принадлежащие ему объекты. Это позволяет, в большинстве случаев, обойтись без деструкторов и практически устраняет утечки памяти (ну или, по крайней мере, сильно облегчает их отладку). Использование owner'ов связывает все данные в программе единой древообразной структурой, что позволяет ввести полуавтоматическое детерминированное управление памятью. Части этого дерева могут быть удалены по отдельности (например, когда нужно высвободить память из-под текущей сцены и загрузить новую), а в конце работы приложение удаляет все объекты, начиная с корневого.
  • Менеджер сцен. Каждая сцена - это отдельная сущность со своим набором объектов и ресурсов, логическим контекстом, параметрами графического конвейера и т.д. Сцены определяются заранее и загружаются по требованию. Доступ к сценам осуществляется по уникальным именам - можно изнутри одной сцены переключиться на другую. Набор сцен определяет структуру игрового приложения: заставки, меню, уровни, режим отладки/редактирования и т.д. Все как в движках типа Unity или BGE.
  • Модель сущностей и компонентов (entity-component), позволяющая расширять функциональность объектов динамически, без наследования классов. Сущность (Entity) - это сценический объект, способный что-то рендерить в определенной точке пространства. Компоненты, которые в Dagon называются поведениями (Behaviour), задают внутреннюю логику сущностей. Например, при помощи поведений можно заставить сущность реагировать на нажатия клавиш и другие события. Можно добавлять несколько поведений, тем самым наделяя объекты различными комбинациями способностей.
  • Контроллер - специальная абстракция, позволяющая гибко управлять трансформацией сущностей. Например, можно создать контроллер твердого тела, чтобы синхронизировать сущность с телом в физическом движке, либо контроллер персонажа, позволяющий двигать сущность по законам кинематики. Контроллеры, опять-таки, можно переключать, что позволяет добиться интересного поведения объектов - например, запрыгнув на поезд, персонаж может получить специальный контроллер, двигающий его вместе с поездом, а когда он слезает на землю, то к нему возвращается контроллер по умолчанию.
  • Система материалов с разделением на абстрактный фронтенд (набор параметров) и специализированный бэкенд (передатчик параметров графическому конвейеру). Основная идея - отделение описания материала от непосредственной его реализации - например, для настройки качества графики в игре, комбинирования различных опциональных эффектов, которые можно настраивать на уровне бэкенда, а не материала. Система позволяет использовать как стандартные материалы с известным набором параметров, так и создавать свои, специализированные.
  • Динамическая перезагрузка ресурсов при их модификации сторонним приложением без перезапуска игры. 
  • Система событий. 
  • Встроенная логика для камеры от первого лица (first person view) и свободного просмотра сцены (freeview).
    Я рассчитываю, что перенос Atrium на Dagon сильно упростит и упорядочит логику игры. Кроме того, новая архитектура позволит ввести поддержку разных интересных современных графических техник.

    Комментариев нет:

    Отправить комментарий