Наконец-то дошли руки написать теоретическую статью о модели освещения, которую я использую в движке, со всеми формулами и ссылками на научную литературу. Это GGX/Trowbridge-Reitz, на которую опирается освещение в Unreal Engine 4 и многих других движках — физически обоснованная модель зеркально отраженного света для изотропных шероховатых поверхностей. Ее многие сейчас используют, одни и те же уравнения можно встретить в самых разных движках, но мало кто задумывается, откуда они взялись.
Поскольку в тексте много математики, я оформил статью в виде PDF — можно скачать файл или читать при помощи встроенного в браузер просмотрщика.
Разработка Dagon 2.0 началась в весьма бодром темпе. Deferred-рендер уже почти готов — остались только тени PSM и DPSM, поддержка локальных зондов освещения и forward-проход. Я добавил систему кэширования ресурсов, сжатие в BC7 (на основе компрессора bc7enc Рича Гелдриха) и проделал еще множество мелких улучшений на разных стадиях формирования кадра. Особое внимание я уделил тому, чтобы картинка соответствовала Eevee в Blender 5.
Что еще нового? Часть функциональности, которая в Dagon 1.0 реализована в качестве расширений, теперь входит в ядро — это физика на базе Jolt и загрузчик текстур в формате KTX/KTX2. Такое решение я принял исходя из полезности этих фич, простоты сборки Jolt и libktx из исходников и их автономности: они не имеют собственных зависимостей и отлично работают на всех платформах (в противовес тому же Newton, который имеет проблемы с работой некоторых функций под Linux). Наличие libktx «из коробки» дает серьезные преимущества и ставит Dagon 2 в авангард движкостроения; в будущем не исключен перевод текстурного кэша с DDS на KTX2.
Еще одним нововведением будет встроенная VM GScript3, которую я разработал в прошлом году. Движок при старте загружает скомпилированный байт-код скрипта и выполняет его, а скрипт, в свою очередь, навешивает обработчики событий, позволяя, таким образом, выполнять внешнюю логику без пересборки игры. Игра может экспонировать скриптовой системе свои данные и методы, что полезно для создания модов. Некоторые встроенные классы Dagon уже реализуют интерфейс GsObject и напрямую совместимы с GScript: это Entity, Scene, World, BaseGame.
Зарегистрирован пакет dagon2 в реестре DUB, так что начать пользоваться можно уже сейчас, несмотря на то, что разработка находится на ранней стадии.
В дополнение к простому конвертеру из равнопромежуточных карт окружения в кубические карты, в Dagon появилась поддержка предварительной фильтрации (prefiltering) — то есть, свертки кубических карт с использованием GGX BRDF под различные значения шероховатости. Результаты свертки сохраняются в mip-уровнях. Этот процесс является одной из ключевых оптимизаций PBR, поскольку избавляет от необходимости вычислять интеграл облученности в реальном времени. Префильтрация осуществляется очень быстро на GPU, поэтому ее, в принципе, можно делать каждый раз при запуске приложения (но лучше, конечно, однократно с кэшированием в файл — скоро добавлю и такую возможность). Преимуществом является то, что теперь для этого необязательно использовать сторонние утилиты типа IBLBaker — движок все делает сам.
Реализация основана на классическом методе (выборка по последовательности ван дер Корпута-Хаммерсли), описанном в статье «Real Shading in Unreal Engine 4» (Брайан Карис, Epic Games, SIGGRAPH 2013).
Пролетел еще один год, и это значит, что наступило время для традиционного подведения итогов. С психологической стороны год для меня был непростой, но интересный, а с материальной — весьма успешный. К сожалению, времени на хобби-проекты выдалось меньше, чем хотелось бы.
Можно считать, что я достиг своей цели — стать профессиональным разработчиком игр. На сегодняшний день солидную долю моих доходов составляют фрилансерские проекты по разработке рекламных мини-игр и интерактивных баннеров. И, хотя все они пишутся на JavaScript, я стал чаще по работе использовать D для создания различных утилит, что не может не радовать.
Выпустил Dagon 0.15, в котором появилась поддержка Hald CLUT, 1D и 3D-текстуры, новые параметры постобработки для ручного управления эффектом Depth of Field, новые методы для текстур, обновлен биндинг Newton.
Я наконец-то дописал вводную статью о PBR для начинающих, она доступна на сайте журнала «FPS». Кстати в уходящем году журналу исполнилось уже 15 лет.
Начал изучать микроконтроллеры — Arduino и ESP32. Полным ходом иду к своей детской мечте — сделать своими руками радиоуправляемую машинку (как-нибудь напишу пост об этом проекте).
Ну и, конечно, не могу не назвать самые значимые для меня события в мире IT:
Выход Blender 4.0
Выход Godot 4
Смена ценовой политики Unity
Появление ChatGPT (хотя я не думаю, что нейросети в обозримом будущем кого-то заменят).
В Dagon наконец-то появилась качественная аппроксимация подповерхностного рассеивания — фича, которую я в том или ином виде пытаюсь реализовать уже не первый год. Идею позаимствовал из Disney BRDF.
PBR (physically-based rendering) в последние годы стал стандартом фотореалистичной графики во всех мейнстримных игровых движках, пакетах моделирования, магазинах стоковых 3D-моделей и т.д. Любой моделлер сегодня обязан уметь работать с текстурами roughness и metallic, а любой GPU-программист — разбираться в азах оптики и понимать, что такое BRDF. Хорошо, если вы много лет работаете в сфере 3D-рендеринга, и все эти нововведения появились у вас на глазах — вы уже давно понимаете, что к чему — однако с нуля разобраться в этой теме очень непросто. Рендеринг превратился в целую науку на стыке оптики, векторной алгебры и вычислительной геометрии, а PBR уже можно считать фундаментальной теорией в рамках этой науки. Моя статья «PBR. Секреты фотореалистичной графики» для журнала «FPS» посвящена основным концепциям PBR — факторам, которые обязан учитывать любой рендер, претендующий на реалистичность.
В следующей версии Dagon появится поддержка кубических карт в формате DDS. Чаще всего для кубических карт этот формат используется, если необходимо хранить предрассчитанные зеркальные лепестки (specular lobes) для разных уровней шероховатости — DDS позволяет хранить эти данные в mip-уровнях текстуры и быстро загружать их без промежуточного декодирования.
До этого единственным доступным вариантом была генерация mip-уровней в самом движке, но это делалось блочным фильтром, без учета BRDF. Теперь свертку карты окружения можно осуществлять при помощи внешних инструментов — я рекомендую, например, IBLBaker.
В следующей версии движка, 0.11, будут полностью переписаны рендер и система постобработки, а также изменена структура модулей. Как следствие, Dagon потеряет совместимость со старыми проектами, но зато появится возможность практически не ограниченного расширения движка путем создания пользовательских графических конвейеров. Новая версия Dagon разрабатывается в ветке dagon-ng.
Из уже реализованных возможностей можно отметить почти готовый отложенный рендер с оптимизациями производительности и расхода памяти (например, больше не используется буфер позиций, позиции вычисляются на основе буфера глубины). Стало возможным изменение разрешения окна/вьюпорта в процессе работы приложения. Кроме того, был улучшен сэмплинг карты окружения — используется нелинейная зависимость mip-уровня от шероховатости, реализованная по методу, предложенному Морганом Макгуайром, что повысило реалистичность материалов с низкой и средней шероховатостью:
Экранное затенение среды (SSAO) было вынесено в отдельный буфер, что позволяет использовать данные о затенении на разных этапах конвейера. Был добавлен денойзер, благодаря которому удается рендерить SSAO без шума с небольшим количеством сэмплов:
Демку новой ветки Dagon с функциями редактора можно найти тут.
Выпустил новую версию Dagon с экспериментальной поддержкой PBR и рендеринга в линейном цветовом пространстве. В данный момент PBR-материалы не поддерживают текстуры для металличности и шероховатости (принимаются только числовые значения), а также произвольные изображения для освещения среды, но вскоре это будет исправлено.
Также добавлена поддержка HDR-текстур, чтение ввода с джойстика, улучшены многие графические и служебные компоненты.
Одновременно обновлена и демка движка — добавлена физика автомобиля, все материалы переведены на PBR. Релиз с готовыми сборками будет в ближайшее время.