Итоги 2023 года

Пролетел еще один год, и это значит, что наступило время для традиционного подведения итогов. С психологической стороны год для меня был непростой, но интересный, а с материальной – весьма успешный. К сожалению, времени на хобби-проекты выдалось меньше, чем хотелось бы.

  • Можно считать, что я достиг своей цели – стать профессиональным разработчиком игр. На сегодняшний день солидную долю моих доходов составляют фрилансерские проекты по разработке рекламных мини-игр и интерактивных баннеров. И, хотя все они пишутся на JavaScript, я стал чаще по работе использовать D для создания различных утилит, что не может не радовать.
  • Выпустил Dagon 0.15, в котором появилась поддержка Hald CLUT, 1D и 3D-текстуры, новые параметры постобработки для ручного управления эффектом Depth of Field, новые методы для текстур, обновлен биндинг Newton.
  • В репозиторий с примерами Dagon добавлены примеры создания ландшафта и работы с пользовательскими шейдерами.
  • Выпустил dlib 1.2.0 и 1.2.1. Добавлены функции гомотетии (масштабирования относительно точки), функции конвертации радианов в обороты и обратно, медианный фильтр, а также функция отрисовки прямоугольника. Спасибо Олегу Бахареву aka aquaratixc, Aaron Nédélec aka ReactiveAlkali, Razvan Nitu aka RazvanN7, Nick Treleaven aka ntrel за багфиксы и новые фичи.
  • Я наконец-то дописал вводную статью о PBR для начинающих, она доступна на сайте журнала “FPS”. Кстати в уходящем году журналу исполнилось уже 15 лет.
  • Начал изучать микроконтроллеры – Arduino и ESP32. Полным ходом иду к своей детской мечте – сделать своими руками радиоуправляемую машинку (как-нибудь напишу пост об этом проекте).

Ну и, конечно, не могу не назвать самые значимые для меня события в мире IT:

  • Выход Blender 4.0
  • Выход Godot 4
  • Смена ценовой политики Unity
  • Появление ChatGPT (хотя я не думаю, что нейросети в обозримом будущем кого-то заменят).

Освещение интерьера в Dagon

Добавил в Dagon экспериментальную поддержку зондов освещения среды (environment probes). Это специальные невидимые объекты, которые перезаписывают освещение среды в буфере кадра для всех пикселей внутри прямоугольной коробки заданного размера. То есть, вы можете, например, создать комнату с зондом такого же размера внутри – он будет влиять на освещение внутри комнаты, а все, что снаружи, будет освещаться при помощи глобальной карты окружения, заданной в опциях environment текущей сцены. Таким образом, решается проблема неправильных “наружных” отражений в интерьере. Скриншоты ниже демонстрируют разницу:

Некорректные отражения на стенах внутри комнаты + в целом, слишком яркий интерьер
Световой зонд заменяет освещение среды в комнате на более тусклое

По сути, это простейшая аппроксимация GI. Зонд может освещать интерьер однородным излучением заданного цвета, либо использовать собственную HDR-карту окружения. Единственная нерешенная на данный момент проблема – видимая граница двух сред освещения в тех местах, где отсутствует геометрия здания (т.е. в дверных проемах). Поэтому при использовании данной фичи необходимо как-то маскировать эту границу – например, сделать в этом месте порог или переход текстуры пола.

Новые примеры

Добавил в коллекцию примеров Dagon свою старую демку с планетой – она показывает, как создавать пользовательские шейдеры. Каждый объект сцены использует специализированный шейдер: звездное небо, газовый гигант с эффектом рассеивания света в атмосфере, кольца с тенью.

Также добавлен пример создания ландшафта и многослойного материала для него.

Subsurface Scattering в Dagon

В Dagon наконец-то появилась качественная аппроксимация подповерхностного рассеивания – фича, которую я в том или ином виде пытаюсь реализовать уже не первый год. Идею позаимствовал из Disney BRDF.

(далее…)

Обновления

Лето подошло к концу – это печально 🙁 Но при этом спешу порадовать читателей хорошими новостями: одновременно вышли новые версии dlib и Dagon.

dlib 1.2.1 – в основном, исправляющий релиз. Исправлены ошибки в dlib.filesystem.posix.common, предупреждения о депрекациях в dlib.core.thread и dlib.math.utils. В dlib.image добавлен медианный фильтр (модуль dlib.image.filters.median).

Dagon 0.15.0 – первый релиз за последний год. Добавлена поддержка 1D и 3D-текстур и новые методы для класса Texture (setFaceImage, setFaceBit, createFromImage3D). Шейдер цветовых таблиц (LUT) теперь поддерживает таблицы в формате Hald CLUT – нужно создать 3D-текстуру из изображения Hald CLUT и просто передать в game.postProcessingRenderer.colorLookupTable. Появились новые параметры шейдера глубины резкости (DoF) для ручного управления эффектом: dofManual, dofNearStart, dofNearDistance, dofFarStart, dofFarDistance. Загрузчик glTF теперь декодирует встроенные в JSON-файл текстуры. Менеджер событий обзавелся поддержкой относительного режима мыши (EventManager.setRelativeMouseMode) для более надежной реализации управления мышью в играх. Соответственно, компонент управления FirstPersonViewComponent теперь использует по умолчанию относительный режим.
Обновился биндинг Newton Dynamics до свежей версии библиотеки: функция NewtonUserJointSetRowSpringDamperAcceleration удалена в пользу NewtonUserJointSetRowMassDependentSpringDamperAcceleration и NewtonUserJointSetRowMassIndependentSpringDamperAcceleration. Добавлен новый метод для ньютоновских твердых тел: NewtonRigidBody.localPointVelocity.