В данном задании вам предстоит реализовать технику отложенного освещения, применяемую в большинстве современных консольных и ПК-игр. После выполнения этого задания должно стать сильно понятнее, что же такое наблюдалось в захватах из задания capture.
- Скопируйте в эту папку любой рендерер уже рисующий что-то, аналогично предыдущим заданиям. В идеале он должен включать в себя все релевантные предыдущие домашки.
- Вспомните материал занятий о продвинутых техниках освещения.
Переделайте ваш рендерер на отложенное освещение. В G-буфере будем хранить следующую информацию, возможно, несколькими изображениями:
- альбедо,
- нормаль,
- глубину.
В целом, контент G-буфера сильно варьируется от проекта к проекту, выберите то, что вам больше по душе. Единственное, что делать в рамках данного задания запрещено — это сохранять в G-буфер позицию фрагмента.
Поменяйте основной шейдер отрисовки сцены чтобы он заполнял слои G-буфера а не рассчитывал итоговый цвет.
Если вы реализовали в одной из предыдущих домашек материалы, то дополнительно вам придётся хранить некоторый набор других параметров PBR-рендеринга:
- металличность,
- шершавость,
- тип материала,
- эмиссивность,
- и так далее.
Более того, вероятно вы сможете в зависимости от типа материала переиспользовать одни и те же байты для разных параметров, чтобы уменьшить давление на память в процессе заполнения G-буфера.
Напишите (пиксельный или компьют) шейдер резолва G-буфера. Этот шейдер должен проходиться по источникам света на сцене и рассчитывать итоговое освещение для фрагментов поверхности закодированных в пикселях G-буфера, записывая результат в финальное изображение. Для этого вам придётся загрузить информацию об источниках света присутствующих на сцене в отдельный uniform-буфер. Более того, чтобы восстановить позицию фрагмента в мировых координатах по глубине и экранным координатам, вам придётся вспомнить линейную алгебру и аккуратно использовать обратные матрицы преобразований.
Рекомендация: освещение считайте в системе координат в которой начало отсчёта привязано к камере. Это позволит избежать проблем с потерей точности на более крупных сценах.
Напомним, что в G-буфер можно писать только непрозрачную геометрию. Прозрачные объекты сцены должны быть отрисованы после резолва уже в итоговый таргет.
Не забудьте добавить на сцену побольше источников освещения чтобы протестировать производительность и корректность вашего кода.
Для удобства рекомендуется вывести возможность двигать источники освещения в окошко ImGui.
Также можно использовать расширение glTF KHR_lights_punctual
, позволяющие хранить источники света в файле модели, а не хардкодить их в плюсах.
Постарайтесь максимально "компрессировать" представление каждого пикселя в G-буфере, чтобы запись каждого фрагмента требовала как можно меньше трафика памяти. Померьте при помощи профилировщика, насколько компрессия улучшила производительность отрисовки в G-буфер на GPU.
ВНИМАНИЕ: за этот бонус полагается много баллов
Прочитайте статью о кластеризированном отложенном освещении и реализуйте его.
Проверьте, что теперь вы можете добавить в десятки раз больше источников освещения влияющих на малую окрестность сцены (например, светлячки, факелы, фонари), получив сносную производительность. Для возможности сравнивать код до добавления кластеризации и после рекомендуется сделать коммит с версией кода "до".
Прочитайте блогпост про проективные декали в отложенном освещении (включая ссылки на литературу) и реализуйте их.
Заметим, что декали практически никогда не хранят в файлах моделей. Вместо этого они обычно хранятся в более высокоуровневых форматах описания сцен, специфичных для конкретной игры и редактора. В связи с этим предлагается просто захардкодить некоторое количество декалей если у вас нет террейна, а если есть, сгенерировать рандомные боксы с декалями на террейне.
- https://learnopengl.com/Advanced-Lighting/Deferred-Shading — сносное описание отложенного освещения
- https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_lights_punctual/README.md — расширение glTF для хранения источников освещения в файле модели
- https://diglib.eg.org/bitstreams/237032bc-faae-48ce-812a-3fede4d80833/download — кластерезированное отложенное освещение
- https://mtnphil.wordpress.com/2014/05/24/decals-deferred-rendering/ — рассказ про декали в отложенном освещении "на пальцах"