Упрощенный рендеринг

По мере усложнения стандартного рендер-движка Dagon, повышаются и системные требования – в данный момент он требует довольно мощную видеокарту геймерского класса, желательно NVIDIA. Но, поскольку далеко не все игры обязаны иметь топовую графику, неплохо предусмотреть в движке некий облегченный режим, оптимальный для казуальных жанров и стилизации под ретро, где не нужен сложный пайплайн с реалистичным освещением и PBR. В Dagon рендер уже давно структурно вынесен в отдельную систему, которую можно модифицировать и даже полностью заменять, не трогая остальной код движка – модель данных сцены и менеджер ресурсов в Dagon полностью независимы от рендера. Это позволило без особых сложностей добавить упрощенный рендер-движок SimpleRenderer, который вы можете создать в вашем классе игры (на базе Game или Application) и заменить им стандартный DeferredRenderer.

SimpleRenderer полностью переопределяет рендеринг объектов. Здесь по умолчанию нет физически обоснованных источников света, карт окружения и т.д. – за освещение отвечает простейшая модель Блинна-Фонга, которая в данный момент работает с одним глобальным направленным источником света (environment.sun текущей сцены). Нет normal mapping’а и прочих эффектов материала – учитывается только baseColorFactor/baseColorTexture. Но зато вы можете назначить вашим материалам любой шейдер с любыми эффектами – в DeferredRenderer такой возможности нет (все объекты с пользовательскими шейдерами трактуются как forward и рендерятся отдельно, после всех deferred-проходов). Также в этой системе поддерживаются слои, что позволяет явным образом задавать порядок рендеринга группам объектов – например, можно занести все прозрачные объекты в отдельный слой, который рисуется поверх дефолтного.

SimpleRenderer отлично подойдет для создания игр для low-end железа, он будет работать даже на самых слабых системах.

Бокс-проекция

Добавил в Dagon поддержку бокс-проекции для световых зондов окружения (EnvironmentProbe). Техника старая, но никем не отмененная – а главное, хорошо сочетается с deferred-рендером!

Стандартный environment mapping предполагает, что стенки виртуальной среды, с которой считывается освещение, бесконечно удалены от объектов сцены. Это допущение работает для открытого пространства, но не годится для интерьера. Бокс-проекция корректирует сэмплинг из карты окружения так, что результат выровнен по сторонам бокса заданного размера, благодаря чему минимумом ресурсов достигается сносного качества непрямое освещение в интерьере (если, конечно, карта окружения 1 в 1 совпадает с моделью комнаты). Это эффективный способ аппроксимировать локальный GI в ограниченном пространстве: окружение интерьера, с которого рендерилась карта, статичное, но любые другие объекты могут быть динамическими. При трансформации камеры или объекта внутри комнаты, отражения соответствующим образом меняются, причем как зеркальные, так и диффузные.

Получается даже имитировать объемные источники света! На скриншотах ниже нет ничего, кроме параллельного источника света для солнца и двух статичных карт окружения – для улицы и для интерьера. Отражения окон и светящегося блока на полу получаются автоматически:

Главным минусом техники является то, что создать под нее правильную карту не очень просто – нужно учитывать различия в координатных системах.

Итоги 2024 года

Декабрь – время традиционного подведения итогов за прошедший год:

  • Выпустил три версии Dagon – 0.16, 0.17 и 0.18. В движке появились подповерхностное рассеивание, зонды локального освещения среды, тональная компрессия AgX, улучшен встроенный контроллер персонажа. Добавлена поддержка Wayland под Linux и поддержка экранов с высокой частотой обновления. Наконец-то появились меш-группы в загрузчике OBJ, что позволяет рендерить загруженную модель по частям с различными материалами и настройками. Появился новый встроенный шейдер звездного неба для ночных сцен и игр с космической тематикой. Доступны новые примеры: веревка на основе интегрирования Верле и механика игры от третьего лица.
  • Dagon, в числе других примечательных проектов на языке D, был упомянут на конференции FOSDEM 2024 в Брюсселе, а позже на эту тему вышло интервью со мной в онлайн-издании “Вечерняя Казань”.
  • Выпустил dlib 1.3.0, где был проделан ряд улучшений в математическом пакете и добавлен новый модуль dlib.math.random. Спасибо Александру Перфильеву aka aperfilev за багфиксы и поддержку GNU D Compiler в dlib.math.sse. В марте этого года библиотека побила все рекорды по скачиваниям за все время существования проекта – 14000 в месяц!

Ну и, конечно, небольшой список интересных событий в мире D и графического СПО:

  • Функция тональной компрессии AgX стала новым де-факто стандартом индустрии;
  • В языке Slang добавлена поддержка WGSL, что позволяет с большим удобством писать шейдеры для WebGPU-приложений;
  • На FOSDEM ’24 был представлен ознакомительный доклад о языке D и его преимуществах для разработки приложений компьютерной графики.
  • Upd: у GitHub Copilot появился бесплатный ограниченный доступ!

Dagon 0.18

Выпустил новую версию Dagon. В загрузчике OBJ наконец-то появилась поддержка групп – если в файле присутствуют группы, они будут доступны через свойство OBJAsset.groupMesh, так что вы можете использовать их в качестве отдельных мешей вместо единого OBJAsset.mesh. Также загрузчик теперь не падает на моделях с N-гонами, а выводит предупреждение, что они не поддерживаются.

Добавлен новый экстра-шейдер dagon.extra.starfieldsky – ночное небо со звездами. Он представляет собой улучшенную версию шейдера звездного неба из демки с планетой. Основное нововведение – поддержка мерцания звезд.

Слегка переделан NewtonCharacterComponent: появился новый параметр радиуса. Логика теперь следующая: контроллер персонажа, как и прежде, представлен двумя Newton-сферами, но их радиус теперь задается пользователем, а не вычисляется автоматически. Сферы располагаются сверху и снизу от барицентра на расстояниях, которые вычисляются исходя из радиуса и роста персонажа.

В dagon:iqm появились новые свойства для анимированных моделей: Actor.looping (зацикленность), Actor.state.finished (индикатор завершения текущей анимации). Исправлен баг с фейсгруппами при загрузке некоторых IQM.

Пример игры от третьего лица

Добавил в папку примеров Dagon демонстрацию управления от третьего лица. Персонаж работает на Newton-контроллере, поэтому будет реагировать со всеми телами, которые вы создадите через Newton. Можно вращать камеру вокруг персонажа, двигаться (WASD) и прыгать (пробел). Пример также показывает, как загружать модели формата IQM и воспроизводить анимацию.

Скачать

Upd (15.08.24): улучшил управление и контроллер камеры – теперь все работает как в популярных играх: направление движения задается направлением камеры, которая управляется мышью, но, в то же время, игрок может стрейфиться – персонаж может ходить во все четыре стороны. Также добавил атаку (левая кнопка мыши) и звуки движений, в будущем планирую сделать врагов и простенькую демонстрационную боевую систему.