Прогресс по Dagon/gl33

В ветке gl33 реализован кластерный рендеринг и шейдер неба. Добавлена оптимизация кластерного рендеринга, заключающаяся в том, чтобы хранить позиции источников света в world-space и не обновлять буферы, если источники света на сцене не меняются.

Dagon 0.4.0 и прогресс по gl33

Выпустил новую версию Dagon — 0.4.0. Основное нововведение релиза — встроенные каскадные тени на основе массива текстур (поддержка обычных теневых карт удалена). Исправлен баг с parallax mapping, из-за которого сдвиг текстурных координат происходил для всех материалов, даже тех, которые не используют эту технику. Кроме того, появилась возможность отключать динамическии рассчитываемый цвет неба/фона. Движок теперь использует OpenGL 2.1.

Это последняя версия Dagon, использующая старый OpenGL — дальнейшая разработка будет сосредоточена на ветке gl33. Новый Dagon будет максимально совместим со старым, но будет несколько косметических изменений в некоторых интерфейсах. Картинка останется неизменной, все шейдеры напрямую портируются из старой кодовой базы.

В ветке gl33, между тем, реализованы вывод текста, постобработка, рендеринг теней, добавлен стандартный бэкенд материала BlinnPhongBackend, в котором реализованы normal mapping и parallax occlusion mapping. Демка ветки приближается по графике к сцене First Person из стандартного демонстрационного приложения Dagon.

Dagon + OpenGL 3.3

Рано или поздно я должен был перейти на современный OpenGL, и этот «час X» наступил. Поводом стали вскрывшиеся проблемы с расширением GL_EXT_gpu_shader4 для старых версий OpenGL на видеокартах AMD и Intel (плохо не иметь много разных конфигураций для тестов!). Решив больше не мучаться с расширениями в попытках сохранить совместимость с железом эпохи OpenGL 2.x, я начал портировать Dagon на OpenGL 3.3 core profile. Переход оказался не слишком сложным — движок почти не использует устаревшую функциональность и по архитектуре неплохо вписывается в современные версии стандарта. Разработка порта ведется в отдельной ветке — gl33. На данный момент готовы рендеринг статических мешей и загрузка текстур, а также заготовка для стандартных бэкендов материалов.

Dagon 0.3.0

Выпустил новую версию Dagon — 0.3.0. Главное нововведение релиза — поддержка кластерного рендеринга, а также эффектов постобрабоки (реализованы FXAA и lens distortion). Кроме того, появился шейдер неба.

Соответственно, обновлена демка — улучшен пример движка от первого лица, куда добавлены почти все фичи Dagon. Скачать ее можно тут.

Осталось реализовать PBR-материалы и поддержку формата DGL3 (хотя, скорее всего, я сделаю новый формат для хранения сцен, с учетом всех возможностей Dagon).

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

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

Сверточные фильтры в dlib с выводом в QtE

Очередной замечательный материал по dlib от LightHouse Software — продолжение серии статей по обработке изображений в dlib.

От автора:
«В этой статье мы попытаемся подружить QtE5 и dlib, сделав несложный и удобный интерфейс для накладывания фильтров на изображения, оставив при этом возможность для пользователя добавлять свои фильтры».

http://lhs-blog.info/programming/dlang/digital-filters

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

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

Скачать для Windows

Clustered Forward Shading

Уже давно пытаюсь решить проблему множества источников света в классическом прямом рендере (честно говоря, очень не хочется переходить на deferred). И недавно я открыл для себя отличную технику, которую теперь хочу попробовать применить в Dagon — clustered forward shading. Суть ее заключается в индексировании пространства при помощи 3D-текстуры, ячейки которой (кластеры) ссылаются на источники света в буфере, влияющие на пространство внутри данной ячейки (фактически, в ячейке можно хранить срез индексов — смещение и количество источников света — в виде двух 16-битных значений). Пиксельный шейдер, зная позицию точки в world space, сэмплирует ячейку из 3D-текстуры, получает срез и проходит по нему циклом, считывая атрибуты источников света — позицию в eye space, цвет и радиус.

Метод очень перспективный — минимальная нагрузка на GPU, всего две дополнительные служебные текстуры (кластер и буфер источников света), хорошая масштабируемость и почти полная независимость от сложности сцены (есть лишь зависимость от ее размера — чем больше сцена, тем выше разрешение кластера).
Есть, впрочем, и недостатки — во-первых, небольшая дополнительная нагрузка на CPU при обновлении 3D-текстуры и буфера. Но обновлять их нужно только при движении источников света — если у вас статичный свет, то оверхед будет нулевой. Другое узкое место — передача буфера источников света в видеопамять. У меня это текстура GL_RGB32F шириной N * 8, где N — количество ячеек кластера, и высотой 4 — по одной строке на атрибут. N может достигать 1024 и выше — передавать такой буфер из системной памяти каждый кадр может показаться малоэффективным, но можно обновлять не весь буфер, а только те его части, где меняется список источников света (маловероятно, что в обычной игровой ситуации будут сотни движущихся ламп).

Надеюсь вскоре доделать и выложить демку с реализацией данного метода.