Dagon + BindBC

Dagon + BindBC

На днях произошло два крупных события. Во-первых, вышла бета-версия LDC 1.13.0, которая теперь тоже самодостаточна – для сборки 64-битных приложений не нужны библиотеки из Visual Studio. По умолчанию используется линкер LLD.

Во-вторых, я решил отказаться от Derelict в пользу новой разработки Aldacron’а – BindBC. Это фреймворк для создания динамических биндингов, не использующий классы и сборщик мусора (@nogc), и потому отлично вписывающийся в мои принципы разработки. Из других преимуществ – поддержка OpenGL 4.6 и SDL 2.0.9, простота использования (вместо неинтуитивных DerelictGL3.load() и DerelictGL3.reload() теперь просто loadOpenGL()) и более простая обработка ошибок без исключений.

Из других значительных нововведений в Dagon отмечу рендеринг воды, новый шейдер неба по модели Рэлея и автоматический деплой – Dub теперь копирует библиотеки и внутренние данные движка в папку с проектом после каждой сборки.

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

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

Давно не отчитывался по проектам, хотя за последние месяцы произошло довольно много интересного. Во-первых, я обзавелся новым, более мощным ноутбуком, который отлично тянет 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.

Интерполяция на основе сигмоиды

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

float sigmoid(float x, float k)
{
    return (x + x * k - k * 0.5 - 0.5) / 
        (abs(x * k * 4.0 - k * 2.0) - k + 1.0) + 0.5;
}

При k = 0 функция обращается в линейную, при k = 1 – разрывается в точке 0,5. Вы можете увидеть, как это работает, при помощи интерактивного графика на Desmos: https://www.desmos.com/calculator/s0cwcrtzvs.

Результат этой функции передается в привычный mix – то есть, вместо mix(c1, c2, t) пишем mix(c1, c2, sigmoid(t, k)). Получится, например, такое:

(градиенты гамма-скорректированы)

Динамическое небо

Экспериментирую с шейдером неба и солнца. Используется простая модель с линейной интерполяцией – полноценный физически корректный Rayleigh мне показался слишком тяжелым для реалтайма.

Шейдерные эффекты в Dagon

Работаю над убер-шейдером и тенями, а также сделал постобработку, добавил FXAA, SSAO и хроматическую аберрацию: