#opengl #graphics #lighting
#opengl #графика #Освещение
Вопрос:
В настоящее время я работаю над предварительным вычислением статического освещения для небольшого графического движка.
Вот мой текущий рабочий процесс:
- Объекты и источники света имеют тег мобильности (статический или динамический)
- Перед рендерингом вычисляются карты освещения для статического освещения и статических объектов.
- Расчеты динамического освещения выполняются с использованием модели отложенного затенения.
- Статические объекты применяют свои световые карты во время прохождения геометрии.
Проблема заключается в следующем:
В идеале статические источники света будут также освещать динамические объекты, а динамические источники света будут освещать статические объекты (все в отложенном шейдере). Проблема в том, что вклад статического освещения в статические объекты будет «учитываться дважды» в отложенном шейдере, т. Е. статические источники света будут освещать объекты, которые уже были освещены этими источниками света. Каковы некоторые методы учета этого?
Вот некоторые из идей, которые у меня были; однако, все они не идеальны:
- Сделайте так, чтобы статические источники света не освещали динамические объекты (или наоборот: сделайте так, чтобы динамические источники света не освещали статические объекты).
- Вероятно, это был бы мой последний выбор решения.
- Передайте тег мобильности для каждого источника света в отложенный шейдер, а также сделайте тег мобильности частью gbuffer.
- Я действительно не хочу добавлять еще одну цель рендеринга для тега mobility (я уже использую 4 для PBR!).
- Полностью избавиться от предварительно вычисленных световых карт для статической геометрии?
- Я тоже на самом деле не хочу этого делать.
Есть ли какие-либо другие возможные решения этой проблемы?
Комментарии:
1. Вы предварительно вычисляете отдельную карту освещения для каждого объекта для каждого источника света? Разве нельзя было бы предварительно вычислить только карту освещения для статического вклада освещения в каждый статический объект, а затем нарисовать их в отдельном проходе?
2. Я предварительно вычисляю одну карту освещения для каждого объекта. Каждый статический источник света вносит свой вклад в эти световые карты. Я не думаю, что на самом деле было бы невозможно нарисовать статические объекты за другой проход. Для этого потребуется выполнить отложенный проход затенения, затем очистить gbuffer, выполнить еще один проход геометрии, затем еще один отложенный проход затенения. Или я мог бы перенаправить рендеринг статических объектов на другой проход, но это устраняет преимущества отложенного рендеринга (потенциально существует очень много статических объектов и динамических источников света).
3. Итак, если я правильно понимаю, то вам уже нужно нарисовать всю геометрию в gbuffer, потому что статические объекты могут быть освещены динамическими источниками света. И вам уже нужно нарисовать все источники света во время отложенного затенения, потому что динамические объекты могут быть освещены статическими источниками света. Итак, если вам уже приходится рисовать всю геометрию и все источники света, то где именно вы видите световые карты, которые экономят ваши вычисления?
4. Если вы настаиваете на том, чтобы рисовать статический свет на статических объектах как часть прохода отложенного затенения, а не отдельного прямого прохода, тогда вам обязательно придется как-то различать два случая во время отложенного затенения. Нет общего ответа на вопрос, стоит ли это того или нет. Ваша модель затенения вполне может быть настолько дорогой, что пропуск некоторых источников света для некоторых фрагментов в обмен на поиск текстуры плюс накладные расходы на отдельную обработку того стоит. Возможно, ваша обработка вершин настолько дорогостоящая, что вы не можете сделать это дважды. Все сильно зависит от вашего приложения…
5. Я не искал общего ответа, просто некоторые возможные решения (хотя я понимаю, что это сильно зависит от моего приложения). Предварительно вычисленные карты освещения хранят больше информации, чем просто обычное статическое освещение (я также предварительно вычисляю непрямое освещение, используя отображение фотонов). Возможно, мне придется просто записать тег мобильности в gbuffer.