Dagon 0.34.0

Очередной релиз движка. Добавлена поддержка нескольких контроллеров (до 4 включительно). Методы-обработчики событий контроллера в EventListener теперь принимают индекс устройства в качестве первого аргумента. Индексы начинаются с нуля, устройства добавляются в порядке их подключения в системе. EventListener.onControllerAdd теперь принимает GameInputDeviceType в качестве второго аргумента.

Обновлен менеджер ввода. Символ + в клавишных биндингах input.conf заменен на символ _ (то есть, теперь вместоright+ctrl нужно писать right_ctrl). Добавлены символические имена для биндингов мыши (в input.conf): mb_left, mb_middle, mb_right, mb_x1, mb_x2, ma_x, ma_y.

Приложение теперь автоматически определяет разрешение монитора в полноэкранном режиме, если windowWidth и windowHeight указаны как 0. Добавлена поддержка безрамочных окон. Добавлены новые опции settins.conf: localePath, window.maximized, window.minimized, window.borderless, fullscreenWindowed. В режиме fullscreenWindowed размер окна игнорируется, создается безрамочное окно размером с весь экран, как раньше с указанием нулевых windowWidth и windowHeight в оконном режиме.

Добавлена экспериментальная поддержка изотропного рассеивания для позиционных источников света, о котором я писал в предыдущем посте.

Исправлен и расширен класс LoadingScreen — добавлена поддержка HiDPI и фонового изображения.

Рассеивание для позиционных источников света

Добавил в Dagon фичу, которая редко встречается даже в AAA-движках — поддержку изотропного объемного рассеивания для позиционных источников света. До этого уже были т. н. «лучи Бога» для направленного света — более тяжелый анизотропный эффект, основанный на приближенной физике рассеивания света аэрозолями. Теперь, выставив light.scatteringEnable = true для любого источника света, можно сделать «свечение в тумане». Это похоже на постэффект glow, но отличается тем, что объемный свет рассчитывается геометрически, в трехмерном пространстве — поэтому, если самого источника света нет в кадре, свечение все равно видно.

Сочетанием обоих эффектов можно добиться приятной атмосферности в ночных сценах:

Чтобы не создавать лишний оверхед, этот эффект вынесен в отдельный субпроход, который по умолчанию отключен. Включается так:

game.deferred.passLight.volumetricScatteringEnabled = true;

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

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

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

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

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

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

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

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

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

Tube area lights

Добавил в Dagon поддержку трубчатых источников света (tube area lights) по методу, описанному тут. На скриншотах показаны блики от трубок на поверхностях с разной шероховатостью, а также рельефом.

Освещение частиц

Работаю над освещением частиц:

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

Кластерный рендеринг — обновленная демка

Доступна обновленная демонстрация clustered forward shading в Dagon. Повышена плотность кластеров, добавлена поддержка normal mapping и parallax mapping, а вместо бликов по Фонгу теперь используется модель Кука-Торренса.

Скачать для Windows