dlib 0.13.0 и Dagon 0.7.0

На днях состоялись новые релизы двух основных моих проектов — dlib 0.13.0 и Dagon 0.7.0.

Изменения в dlib:

  • Из основной ветки был удален пакет dlib.async. Решение об удалении было принято из соображений безопасности. К сожалению, у пакета в настоящее время нет активных мейнтейнеров, некому исправлять баги, поэтому я посчитал dlib.async недостаточно стабильным для существования в качестве официальной части dlib — хотелось бы, чтобы все компоненты dlib были в одинаковой степени актуальны и поддерживаемы. dlib.async продолжит существование в рамках ветки async, но пользователям рекомендую обратить внимание на более актуальные и законченные асинхронные движки — такие, как vibe-core
  • Добавлен модуль dlib.image.canvas с реализацией класса Canvas — векторного рендер-движка с интерфейсом, похожим на HTML5 canvas. В настоящее время он поддерживает отрисовку полигонов и фигур Безье с заливкой и контуром. Рендеринг осуществляется в заданное пользователем изображение SuperImage.
  • Улучшен декодер файлов Radiance HDR/RGBE — теперь он читает файлы, начинающиеся со строки «#?RGBE»
  • Добавлены функции tone mapping’а (hdrTonemapReinhard, hdrTonemapHable), новые алгоритмы выделения краев (edgeDetectLaplace, edgeDetectSobel), новые методы для структуры Color4f (toLinear, toGamma)
  • Добавлены новые функции для векторов (reflect, refract, faceforward)
  • Добавлены функции для вычисления касательного вектора кривых Безье (bezierTangentVector2, bezierTangentVector3).
Изменения в Dagon:
  • Полноценный HDR-рендеринг с автоматической экспозицией и tone mapping’ом
  • Поддержка HDR-карт окружения в формате Radiance HDR/RGBE
  • Улучшенные каскадные тени (более эффективное заполнение каскадами пирамиды видимости)
  • Переписан весь код, отвечающий за PBR. Теперь используется модель Кука-Торренса вместо Блинна-Фонга. Добавлена поддержка текстур шероховатости (roughness) и металличности (metallic)
  • Переписана система пост-обработки. Все фильтры теперь являются частью стандартной сцены (BaseScene3D), их остается только включить и настроить. Добавлены фильтры размытия при движении, свечения и цветокоррекции (LUT), улучшен фильтр хроматической аберрации
  • Улучшено встроенное процедурное небо — теперь движок сам генерирует геометрию небесного купола
  • Добавлены слои для сортировки объектов при рендеринге
  • Камера от первого лица облегчает рендеринг оружия в шутерах, предоставляя матрицу оружия
  • Улучшена поддержка джойстиков, добавлена поддержка рулей
  • Dagon теперь использует dlib 0.13.0.
Обновление демонстрационного приложения с использованием Dagon 0.7.0 планируется в ближайшие дни.

Улучшенные glow и lens distortion

Реализовал более качественный многопроходный эффект свечения и адаптировал шейдер хроматической аберрации из Wagner:

Пост-обработка в Dagon теперь стала намного проще — все встроенные фильтры легко включаются/выключаются и настраиваются при помощи специального API, являющегося частью класса BaseScene3D. Есть и возможность добавлять свои фильтры.

HDR glow

Добавил эффект свечения, рассчитываемый в HDR:

Тени с учетом карты высот

Обычные теневые карты ничего не знают о рельефе поверхности и ведут себя так, будто она гладкая. Но если у нас есть parallax mapping и, соответственно, данные о высоте фрагмента, можно улучшить картинку путем смещения не только текстурных координат, но и теневых:

vec4 shadowCoord = shadowMatrix * vec4(eyePosition + eyeNormal * height * 0.3, 1.0);

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

Главный недостаток метода — расчет теневых координат происходит пофрагментно, а не повершинно, но на современном железе это не слишком большая жертва.

Не знаю, использовалась ли такая техника раньше, и как она называется — может быть, что-то вроде height-corrected shadow mapping?

Улучшенный color grading

Мне удалось избавиться от эффекта бэндинга при цветокоррекции с использованием таблицы цветов — скоро все изменения будут доступны в репозитории.

Уроки по Dagon

Решил написать цикл вводных уроков по основным возможностям Dagon. Найти их можно тут. Конечно, по мере развития движка они неизбежно будут устаревать, но я постараюсь держать их в актуализированном состоянии.

Также недавно я получил в свое распоряжение руль, и, соответственно, добавил поддержку рулей в Dagon (вернее сказать, улучшил уже существовавшую обертку над API ввода SDL2). Пример Dagon с машиной уже работает с рулями — надеюсь скоро выложить видео.

Планы на будущее следующие: в ближайшее время собираюсь довести до ума поддержку PBR-материалов, после чего выпустить Dagon 0.7 с новым HDR-рендером. Дальше, скорее всего, буду смотреть в сторону deferred rendering, поскольку на прямом рендере стало уже сложно получать современную картинку.

HDR уже здесь

Все улучшения, которые я сделал в Dagon за последние месяцы, доступны в репозитории движка. Обновлено также и демонстрационное приложение. Изменения касаются, главным образом, рендера — Dagon теперь полностью основан на HDR. Используется автоматическая экспозиция (динамическая адаптация к освещению), поддерживаются операторы тональной компрессии Reinhard и Hable/Uncharted. Движок теперь понимает файлы Radiance HDR/RGBE, которые можно использовать в качестве карт окружения.

Также появилась поддержка motion blur (который делается все в том же широком диапазоне), а все доступные фильтры постобработки стали частью стандартной сцены (BaseScene3D). В будущем надеюсь сделать их более настраиваемыми, а также добавить новые фильтры.

Итоги 2017 года

Близится конец года, и, значит, настало время для очередного подведения итогов. К сожалению, в связи с постоянными разъездами и дипломной работой у меня было мало времени на хобби-проекты, но какой-то прогресс все же имеется.

  • Для Atrium был разработан новый графический движок Dagon на основе OpenGL 3.3 и SDL2, поддерживающий множество современных технологий, в том числе CSM и кластерный рендеринг.
  • Я написал ради развлечения симулятор автомобиля с использованием физического движка dmech — в итоге, этот код стал частью демонстрационного приложения Dagon.
  • Вышли несколько важных релизов коллекции библиотек dlib — 0.10, 0.11 и 0.12. Появились новые компоненты — например, dlib.async и dlib.memory, поддержка анимированных изображений и APNG, а также загрузчик формата HDR.
  • Вышли три номера журнала «FPS» (46, 47, 48). В 2018 году журналу исполняется уже 10 лет!
  • «Blender. Настольная книга» теперь доступна на GitHub — в виде markdown-исходников, автоматически публикующихся через gh-pages.
  • На сайте LightHouse Software вышла моя статья по D — Векторная графика в dlib.

Напоследок, по сложившейся традиции, перечислю самые значимые для меня события в мире CG, СПО и геймдева:

  • Бэкенд DMD был перелицензирован под лицензией Boost, что наконец-то сделало компилятор полностью свободным.
  • Начало разработки Blender 2.8 с новым фотореалистичным вьюпортом Eevee.
  • Выход OpenGL 4.6.
  • Закрытие Steam Greenlight.
  • Официальное прекращение развития Flash — важный шаг в сторону открытого веба.
  • Анонс нового открытого фильма от Blender Institure — «Agent 327».

    Новые скриншоты

    Еще несколько скринов грядущего HDR-рендера:

    IBL

    Добавил поддержку карт окружения: