Dagon 2
Новая версия Dagon, которую я разрабатываю с начала 2026 года. Архитектура движка в целом осталась прежней, но внесено множество разнообразных улучшений и оптимизаций, а также полностью переписан рендер, который теперь работает на базе SDL GPU и обеспечивает более реалистичную графику. При этом он не требует более мощной конфигурации железа и работает на тех же видеокартах, что и Dagon 1.0 (я тестирую на GeForce RTX 3050).
Репозиторий: https://github.com/gecko0307/dagon2



Идеи для второй версии движка у меня начали копиться еще до выхода первой. Главным вопросом последних лет была, конечно, перспектива перехода на низкоуровневый графический API (и заодно на SDL3). Кроме того, многие техники и фичи современного рендеринга не слишком хорошо вписывались в архитектуру Dagon 1.0, поэтому я решил с ними повременить. То же самое касалось скриптового языка GScript, который я только в прошлом году довел до уровня применимости в реальных проектах. В общем, все, что я изучал и потихоньку пилил, не добавляя в Dagon 0.x/1.0, станет частью Dagon 2.0.
Нововведения
- Переход на SDL3 и SDL GPU поверх Vulkan;
- Шейдерный воркфлоу теперь основан на GLSL 4.60 и включает встроенный в движок компилятор GLSL в SPIR-V. Модули SPIR-V кэшируются на диск для переиспользования;
- Сильно переработан рендер. Deferred-рендеринг, пост-обработка и вывод теперь объединены в одну структуру. Рендер Dagon 2.0 является полной и корректной реализацией метода split sum approximation, описанного в статье Брайана Кариса «Real Shading in Unreal Engine 4», с доработками и улучшениями. В частности, добавлена поддержка multiple scattering и specular occlusion. Нормали теперь хранятся в мировом пространстве для улучшения когерентности кадров (используется буфер R10G10B10A2). Все стохастические алгоритмы теперь используют перемешанный конгруэнтный генератор (PCG). Рендер теперь использует отдельную irradiance-карту для диффузного света (в Dagon 1.0 использовался максимальный уровень шероховатости specular-карты). Также BRDF LUT теперь генерируется в рантайме, а не загружается из файла;
- Реализована поддержка стохастических отражений в экранном пространстве (SSLR/SSSR) c темпоральным шумоподавлением;
- Оптимизирован шейдер SSAO, добавлена поддержка темпорального шумоподавления;
- Добавлена поддержка анизотропной BRDF Kajiya-Kay для рендеринга волос;
- Менеджер ресурсов теперь использует для хранения ссылок быструю хэш-таблицу
FlatHashMap, что многократно ускорило регистрацию ресурсов и их обход; - Загрузчик текстур полностью основан на SDL3_Image и не использует
dlib.image.io. Поддержка KTX теперь является функцией ядра, а не расширением; - Улучшен загрузчик DDS;
- Добавлен компрессор BC5;
- Тонмаппинг полностью основан на AgX. Все остальные операторы удалены, так как на фоне AgX я их считаю морально устаревшими. Реализованы параметры для управления визуальным стилем (
offset,slope,power,saturation); - Добавлена поддержка алгоритма сглаживания SMAA;
- Появилась поддержка vsync-режима Mailbox;
- Улучшено энергопотребление, снижена покадровая нагрузка на CPU;
- Изменилась семантика классов
SceneиWorld.Sceneтеперь является просто контейнером дляEntityи графических данных; для обработки ввода и кастомной игровой логики используетсяWorld; - Все
Entityпо умолчанию статичны, и их матрицы не пересчитываются каждый кадр, чтобы уменьшить нагрузку на процессор. Для динамических обновлений нужно включитьEntity.dynamicили использоватьEntityController(частичный аналог старомуEntityComponent); - Библиотека Assimp теперь не расширение, а полноправная часть движка. Загрузка glTF, как и других популярных форматов, теперь основана на Assimp;
- Аналогично физика Jolt теперь встроена в ядро движка в виде пакета
dagon.jolt; - В разработке собственный формат ассетов (DAF), который будет намного быстрее и оптимальнее по памяти, чем glTF;
- Вычислительный шейдер ресэмплинга текстур теперь поддерживает фильтр Ланцоша (Lanczos-3), обеспечивая высокое качество при уменьшении размера;
- Встроенная виртуальная машина GScript3. Скрипты пока компилируются внешней утилитой, Dagon только исполняет байт-код. Можно экспонировать скриптам любые функции и свойства игры;
- В синтаксис файлов конфигурации (*.conf) добавлена поддержка переменных. Любое объявленное свойство можно переиспользовать.
Ссылки
Теоретические материалы, на которые я опирался при разработке:
- Bruce Walter, Stephen R. Marschner, Hongsong Li, Kenneth E. Torrance, Microfacet Models for Refraction Through Rough Surfaces, EGSR, 2007
- Holger Dammertz, Hammersley Points on the Hemisphere, 2012
- Brian Karis (Epic Games), Real Shading in Unreal Engine 4. SIGGRAPH, 2013
- Brent Burley, Physically Based Shading at Disney. Walt Disney Animation Studios, SIGGRAPH, 2012
- Eric Heitz, Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs. Journal of Computer Graphics Techniques, 2014
- Sébastien Lagarde, Charles de Rousiers, Moving Frostbite to Physically Based Rendering. SIGGRAPH, 2014
- Sébastien Lagarde, Adopting a physically based shading model, 2011
- Chetan Jags, Image Based Lighting, 2015
- Carmelo J. Fdez-Agüera, A Multiple-Scattering Microfacet Model for Real-Time Image-Based Lighting. Journal of Computer Graphics Techniques, 2019
- Christophe Schlick, An Inexpensive BRDF Model for Physically-based Rendering, 1994
- Pat Hanrahan, Wolfgang Krueger, Reflection from Layered Surfaces due to Subsurface Scattering. Princeton University, Department of Computer Science, USA, 1993
- Melissa E. O’Neill, PCG: A Family of Simple Fast Space-Efficient Statistically Good Algorithms for Random Number Generation. Harvey Mudd College, Computer Science Department, USA, 2014.