Выпустил новую версию Dagon – 0.3.0. Главное нововведение релиза – поддержка кластерного рендеринга, а также эффектов постобрабоки (реализованы FXAA и lens distortion). Кроме того, появился шейдер неба.
Соответственно, обновлена демка – улучшен пример движка от первого лица, куда добавлены почти все фичи Dagon. Скачать ее можно тут.
Осталось реализовать PBR-материалы и поддержку формата DGL3 (хотя, скорее всего, я сделаю новый формат для хранения сцен, с учетом всех возможностей Dagon).
Экспериментирую с шейдером неба и солнца. Используется простая модель с линейной интерполяцией – полноценный физически корректный Rayleigh мне показался слишком тяжелым для реалтайма.
Доступна обновленная демонстрация clustered forward shading в Dagon. Повышена плотность кластеров, добавлена поддержка normal mapping и parallax mapping, а вместо бликов по Фонгу теперь используется модель Кука-Торренса. Скачать для Windows
Уже давно пытаюсь решить проблему множества источников света в классическом прямом рендере (честно говоря, очень не хочется переходить на deferred). И недавно я открыл для себя отличную технику, которую теперь хочу попробовать применить в Dagon – clustered forward shading. Суть ее заключается в индексировании пространства при помощи 3D-текстуры, ячейки которой (кластеры) ссылаются на источники света в буфере, влияющие на пространство внутри данной ячейки (фактически, в ячейке можно хранить срез индексов – смещение и количество источников света – в виде двух 16-битных значений). Пиксельный шейдер, зная позицию точки в world space, сэмплирует ячейку из 3D-текстуры, получает срез и проходит по нему циклом, считывая атрибуты источников света – позицию в eye space, цвет и радиус.
Метод очень перспективный – минимальная нагрузка на GPU, всего две дополнительные служебные текстуры (кластер и буфер источников света), хорошая масштабируемость и почти полная независимость от сложности сцены (есть лишь зависимость от ее размера – чем больше сцена, тем выше разрешение кластера). Есть, впрочем, и недостатки – во-первых, небольшая дополнительная нагрузка на CPU при обновлении 3D-текстуры и буфера. Но обновлять их нужно только при движении источников света – если у вас статичный свет, то оверхед будет нулевой. Другое узкое место – передача буфера источников света в видеопамять. У меня это текстура GL_RGB32F шириной N * 8, где N – количество ячеек кластера, и высотой 4 – по одной строке на атрибут. N может достигать 1024 и выше – передавать такой буфер из системной памяти каждый кадр может показаться малоэффективным, но можно обновлять не весь буфер, а только те его части, где меняется список источников света (маловероятно, что в обычной игровой ситуации будут сотни движущихся ламп).
Надеюсь вскоре доделать и выложить демку с реализацией данного метода.