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 мне показался слишком тяжелым для реалтайма.

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

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

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

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

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

Dagon 0.2.0

Выпустил новую версию Dagon — 0.2.0. Релиз включает изменения, сделанные в рамках демы с автомобильной физикой и различных других примеров, а именно:

  • Система частиц с поддержкой векторных полей
  • Шейдерный бэкенд для материалов
  • Экспериментальная поддержка теневых карт
  • Демонстрационный пример Dagon также обновлен — в сцену с механикой от первого лица добавлены тени.
Также скоро в основную ветку будет внесена система постобработки и поддержка сглаживания FXAA. Следующим шагом будет реализация PBR-бэкенда и поддержки формата DGL3, а затем на Dagon можно будет портировать Atrium.
Скачать демку Dagon 0.2.0 для Windows и Linux можно тут.

Физика автомобиля на D

Давно мечтал написать собственный автосимулятор, хотя бы простенький. Насколько я знаю, на D ничего подобного никто еще не делал, и вот вам proof-of-concept: с использованием dmech можно реализовать вполне сносную физику автомобиля с моделированием колес и подвески на основе лучей (raycast car).

Я, впрочем, не планирую создание полноценной гоночной игры, поэтому не стал моделировать реальные характеристики двигателя, тормозов и т.д. — автомобиль движется под действием двух сил на каждое колесо, продольной и боковой, основанных на взятых «с потолка» константах. В принципе, ничто не мешает сделать точные расчеты этих сил.

Демка использует модифицированную версию dmech, а также Dagon в качестве графического движка (опять-таки с модификациями, которые совсем скоро войдут в основной репозиторий — к примеру, реализованы тени и шейдерный бэкенд для материалов). Все зависимости включены в архив, кроме dlib 0.11.1. Прилагается сборка для Windows. Можете использовать демку в своих проектах (код доступен под лицензией Boost).

Скачать (9,65 Мб)

Текущий статус и планы по проекту Dagon

Ненадолго получив доступ к Windows-машине, я наконец-то собрал под ней Dagon. К сожалению, большую часть времени сейчас мне приходится работать под старым железом, поэтому работа над движком продвигается медленнее, чем хотелось бы. Надеюсь, что этим летом у меня будет возможность довести его до ума и продолжить работу над Atrium. В первую очередь, планирую написать шейдерный бэкенд для системы материалов и загрузчик файлов формата DGL. Также будет поддержка FXAA, SSAO, CSM, DoF, Motion Blur.

Демки Dagon переместились в отдельный репозиторий: https://github.com/gecko0307/dagon-demo. Теперь это всего одно приложение, включающее несколько сцен и меню для переключения между ними. Появилась новая демка с реализацией системы частиц, которая, надеюсь, скоро станет частью движка. Система включает очень быстрый отрисовщик биллбордов для частиц, поддерживает стандартные векторные поля (аттрактор, дефлектор, «черная дыра», вихрь) и позволяет добавлять новые.