Итоги 2018 года

Год подошел концу, а это значит, что наступило время для традиционного подведения итогов.

  • 2018-й ознаменовался множеством значительных улучшений в движке Dagon. Самые важные из них включают переход на OpenGL 4.0, HDR, отложенный рендеринг, новую систему шейдеров, поддержку карт окружения, улучшенные частицы, новые эффекты пост-обработки (SSAO, HDR glow, motion blur, хроматическая аберрация, улучшенный color grading), экспорт сцен из Blender. Также была улучшена поддержка джойстиков и реализована поддержка рулей.
  • Я написал цикл уроков по базовым возможностям Dagon и открыл англоязычный блог на Medium.
  • Вышло три релиза коллекции библиотек dlib – 0.13.0, 0.14.0, 0.15.0.
  • Я запустил краудфандинг своих проектов на Patreon и начал продавать 3D-модели на CGTrader.
  • На сайте LightHouse Software вышли две мои статьи по D – “Преобразование карт окружения при помощи dlib”, “Музыкальный D: синтезатор в 100 строк”.

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

  • Прекращение поддержки OpenGL на macOS.
  • Покупка GitHub корпорацией Microsoft.
  • Открытие исходников PhysX под свободной лицензией.
  • Появление поддержки WebAssembly в компиляторе LDC, включение фронтенда D в GCC, портирование бэкенда DMD на D, отвязывание всех компиляторов D от линкера MSVS при сборке 64-битных приложений. Инструменты развиваются, язык не стоит на месте, и все это, конечно, не может не радовать. 
  • Выход BindBC, нового биндинг-фреймворка от автора Derelict (я стал одним из первых его пользователей).
  • Выход бета-версии Blender 2.80. Очень впечатлили возможности Eevee, но слегка разочаровал отказ от BGE – я-то надеялся, что игровой движок, напротив, будет улучшен и интегрирован с Eevee.
  • Бесплатный релиз движка Armory. Давно и с большим интересом слежу за этим проектом, хотя и не собираюсь отказываться от Dagon в пользу чего-то стороннего.
  • Krita 4.0 и GIMP 2.10.
  • RTX от NVIDIA – трассировка лучей на GPU с игровой производительностью – и, соответственно, выход первых потребительских видеокарт с полной поддержкой этой технологии (линейка GeForce RTX 2080 на базе архитектуры Turing)
  • C&D-письмо автору Spyro: Myths Awaken. Нападки корпораций на фанатское творчество не прекращаются, и это печально.

Dagon 0.9.0 и dlib 0.15.0

На днях вышли новые версии Dagon и dlib – 0.9.0 и 0.15.0 соответственно. Релиз Dagon – самый крупный со времени портирования движка на современный OpenGL: он содержит 190 коммитов, практически весь рендерер был переписан заново. Вот краткий список изменений:

  • Состоялся переход с прямого рендеринга (forward) на отложенный (deferred). Это должно было рано или поздно произойти, все современные движки в той или иной мере используют отложенные эффекты. В Dagon этот рефакторинг серьезно улучшил производительность и позволил полноценно реализовать SSAO. Количество динамических источников света теперь ограничено только fillrate’ом видеокарты. Ценой стало повышенное потребление видеопамяти, также при отложенном рендеринге невозможно эффективно реализовать прозрачность, поэтому все прозрачные объекты рендерятся в прямом fallback-режиме, и для них не учитываются точечные источники света.
  • Система шейдеров была переписана с нуля. Старая система с бэкендами материалов была заменена на шейдеры, все избыточные классы материалов были объединены в один, создавать новые материалы и передавать шейдерам параметры стало значительно проще. Все шейдеры используют GLSL 4.0 Core, ветвление в шейдерах было заменено на uniform-подпрограммы, что повысило производительность и сделало код более читаемым. Материалы с пользовательскими шейдерами также рендерятся в прямом режиме.
  • Была серьезно улучшена система частиц: появилась поддержка мягких частиц, освещения, отбрасывания теней. Также теперь можно создавать несколько эмиттеров в каждой системе. Опционально в качестве частиц можно рендерить любые объекты вместо биллбордов.
  • Добавлена поддержка Screen space ambient occlusion (SSAO).
  • Добавлены шейдер воды по методу Себастьяна Лагарда и модель неба по Рэлею (экспериментально).
  • Dagon теперь использует BindBC вместо Derelict.
  • Добавлена поддержка автоматического деплоя: при каждой сборке Dub копирует в проект все необходимые файлы для запуска, включая DLL’ки под Windows.

Полный список изменений смотрите на странице релиза. Также было обновлено и демонстрационное приложение.

Изменения в dlib по большей части носят исправляющий и косметический характер: я решил постепенно избавиться от устаревших компонентов, в связи с чем следующие модули пометил как deprecated:

  • dlib.image.parallel
  • dlib.math.fixed
  • dlib.functional.quantifiers
  • функции map, filter, reduce в dlib.functional.range.

Следующие модули были удалены:

  • dlib.container.aarray
  • dlib.math.affine
  • dlib.core.fiber (временно перенесен в отдельную ветку до завершения windows-порта)

Нововведения включают:

  • dlib.text.unmanagedstring – альтернативная реализация строк, не использующая сборщик мусора
  • Улучшенные декодеры текстовых кодировок, модуль dlib.text.encodings.
  • Также dlib теперь может быть собран компилятором GDC (за исключением модуля dlib.math.sse, который в этом случае не будет доступен).

Полный список изменений – на странице релиза.

Планы на ближайшее будущее

Планы на ближайшее будущее

Давно не отчитывался по проектам, хотя за последние месяцы произошло довольно много интересного. Во-первых, я обзавелся новым, более мощным ноутбуком, который отлично тянет Dagon, так что отныне смогу работать над движком гораздо больше. Во время установки софта приятной неожиданностью стало то, что последние версии DMD из коробки линкуют 64-битные приложения под Windows в релизном режиме (dub build –build=release) без необходимости установки Visual Studio. Используется линкер LLD из состава LLVM и набор 64-битных библиотек из MinGW. Наконец-то эта позорная зависимость от продуктов MS устранена, и DMD можно считать полностью самодостаточным тулчейном!

Во-вторых, я вернулся к разработке dlib. В планах сейчас – чистка кода от устаревших и неиспользуемых модулей (подробности в Issues), завершение рефакторинга, связанного с ручным управлением памятью, и реализация пула потоков.

Что касается Dagon, то в настоящее время я работаю над новой системой шейдеров, которая в версии 0.9 заменит старый подход с абстрактными бэкендами материалов, значительно упростит создание новых шейдеров и передачу uniform-параметров. Состоится переход с GLSL 3.30 на 4.00, в убершейдерах будут задействованы шейдерные подпрограммы вместо ветвления. Также все шейдеры будут вынесены из D-кода в отдельные файлы, внедряемые на этапе компиляции, что упростит их отладку. На новую систему уже портирован forward-пайплайн. Вы можете следить за этой работой в ветке smartshader. В остальном разработка нового рендера практически завершена, и я надеюсь выпустить 0.9 до конца года.
Между тем, ветка 0.8 также была обновлена для совместимости со свежими версиями DMD и старыми версиями SDL и Freetype – см. Dagon 0.8.3 и dev_0.8.

dlib 0.14.0

На днях состоялся очередной релиз библиотеки dlib – 0.14.0. Из основных нововведений отмечу следующее:

  • SuperImage.pixelFormat теперь возвращает значение типа uint. Это было сделано для того, чтобы можно было расширять dlib.image новыми пиксельными форматами. Значения от 0 до 255 зарезервированы для dlib и используются в стандартных константах PixelFormat. Вместо PixelFormat.RGBA_FLOAT рекомендуется использовать FloatPixelFormat.RGBAF32 из dlib.image.hdri, поскольку в будущем будут добавлены новые float-форматы.
  • Реализовано сохранение изображений в формат Radiance HDR/RGBE (ранее была доступна только загрузка).
  • Добавлены новые фильтры: dlib.image.filters.histogram, dlib.image.filters.binarization.
  • Добавлен новый tonemapper – hdrTonemapACES.
  • Улучшен dlib.image.canvas. Растеризатор фигур Безье теперь поддерживает антиалиасинг (ранее антиалиасинг осуществлялся путем растеризации псевдоконтура алгоритмом Ву). Исправлен баг с рендерингом на неквадратных холстах.
  • В dlib.audio.synth добавлен объектно-ориентированный фреймворк для создания звуковых синтезаторов. Доступны три встроенных синтезатора: SineWaveSynth, SquareWaveSynth, FMSynth. Для рендеринга звука с произвольным синтезатором есть две функции – fillSynth и mixSynth.
  • Добавлен модуль dlib.math.smoothstep с реализациями сигмоид: hermiteSmoothstep, rationalSmoothstep.
  • Добавлена поддержка DMD 2.081.0 в dlib.core.stream.

Важно: начиная с 0.14.0, dlib не поддерживает macOS. О причинах этого бойкота я ранее высказывался в блоге. Скорее всего, функциональность, основанная на POSIX, продолжит работать нормально, но никаких гарантий на будущее нет, и проблемами совместимости с macOS, если они возникнут, я заниматься не буду. Непрерывная интеграция для macOS на Travis также была остановлена. В общем, рекомендую перейти на Linux, FreeBSD или Windows.

P.S. На сайте LightHouse Software за последние месяцы вышли две мои новые статьи:

Хочу также отметить статью aquaratixc Бинаризация методом Оцу в dlib, код из которой вошел в состав dlib 0.14.0.

P.P.S. К сожалению, пока не могу сказать, когда выйдет новая версия Dagon с отложенным рендером. Очень многое еще нужно дописать и реализовать. Но по завершении работы над Dagon 0.9 я планирую перевести на него Atrium, так что самое интересное только начинается.

Patreon

Я решил запустить краудфандинг на Patreon: https://www.patreon.com/gecko0307. Упор, в основном, на три моих главных проекта – dlib, Dagon, dmech. Если я наберу ежемесячное финансирование в $100, то допишу документацию по dlib. Если $500, то буду заниматься разработкой dlib, Dagon и dmech в режиме полного дня, включая написание документации и новых уроков. Все, кто пожертвует $10 и выше, будут перечислены в списке спонсоров в репозиториях и на сайтах проектов.