Skip to content

Latest commit

 

History

History

deferred

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

Отложенное освещение

В данном задании вам предстоит реализовать технику отложенного освещения, применяемую в большинстве современных консольных и ПК-игр. После выполнения этого задания должно стать сильно понятнее, что же такое наблюдалось в захватах из задания capture.

Перед началом

  1. Скопируйте в эту папку любой рендерер уже рисующий что-то, аналогично предыдущим заданиям. В идеале он должен включать в себя все релевантные предыдущие домашки.
  2. Вспомните материал занятий о продвинутых техниках освещения.

Задание

Шаг 1

Переделайте ваш рендерер на отложенное освещение. В G-буфере будем хранить следующую информацию, возможно, несколькими изображениями:

  • альбедо,
  • нормаль,
  • глубину.

В целом, контент G-буфера сильно варьируется от проекта к проекту, выберите то, что вам больше по душе. Единственное, что делать в рамках данного задания запрещено — это сохранять в G-буфер позицию фрагмента.

Поменяйте основной шейдер отрисовки сцены чтобы он заполнял слои G-буфера а не рассчитывал итоговый цвет.

Примечание

Если вы реализовали в одной из предыдущих домашек материалы, то дополнительно вам придётся хранить некоторый набор других параметров PBR-рендеринга:

  • металличность,
  • шершавость,
  • тип материала,
  • эмиссивность,
  • и так далее.

Более того, вероятно вы сможете в зависимости от типа материала переиспользовать одни и те же байты для разных параметров, чтобы уменьшить давление на память в процессе заполнения G-буфера.

Шаг 2

Напишите (пиксельный или компьют) шейдер резолва G-буфера. Этот шейдер должен проходиться по источникам света на сцене и рассчитывать итоговое освещение для фрагментов поверхности закодированных в пикселях G-буфера, записывая результат в финальное изображение. Для этого вам придётся загрузить информацию об источниках света присутствующих на сцене в отдельный uniform-буфер. Более того, чтобы восстановить позицию фрагмента в мировых координатах по глубине и экранным координатам, вам придётся вспомнить линейную алгебру и аккуратно использовать обратные матрицы преобразований.

Рекомендация: освещение считайте в системе координат в которой начало отсчёта привязано к камере. Это позволит избежать проблем с потерей точности на более крупных сценах.

Напомним, что в G-буфер можно писать только непрозрачную геометрию. Прозрачные объекты сцены должны быть отрисованы после резолва уже в итоговый таргет.

Не забудьте добавить на сцену побольше источников освещения чтобы протестировать производительность и корректность вашего кода. Для удобства рекомендуется вывести возможность двигать источники освещения в окошко ImGui. Также можно использовать расширение glTF KHR_lights_punctual, позволяющие хранить источники света в файле модели, а не хардкодить их в плюсах.

Шаг 3

Постарайтесь максимально "компрессировать" представление каждого пикселя в G-буфере, чтобы запись каждого фрагмента требовала как можно меньше трафика памяти. Померьте при помощи профилировщика, насколько компрессия улучшила производительность отрисовки в G-буфер на GPU.

Бонусный уровень

Вариант 1: clustered deferred lighting

ВНИМАНИЕ: за этот бонус полагается много баллов

Прочитайте статью о кластеризированном отложенном освещении и реализуйте его.

Проверьте, что теперь вы можете добавить в десятки раз больше источников освещения влияющих на малую окрестность сцены (например, светлячки, факелы, фонари), получив сносную производительность. Для возможности сравнивать код до добавления кластеризации и после рекомендуется сделать коммит с версией кода "до".

Вариант 2: декали

Прочитайте блогпост про проективные декали в отложенном освещении (включая ссылки на литературу) и реализуйте их.

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

Полезные материалы

  1. https://learnopengl.com/Advanced-Lighting/Deferred-Shading — сносное описание отложенного освещения
  2. https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_lights_punctual/README.md — расширение glTF для хранения источников освещения в файле модели
  3. https://diglib.eg.org/bitstreams/237032bc-faae-48ce-812a-3fede4d80833/download — кластерезированное отложенное освещение
  4. https://mtnphil.wordpress.com/2014/05/24/decals-deferred-rendering/ — рассказ про декали в отложенном освещении "на пальцах"