Как использовать одну карту теней для нескольких точечных источников света?

Насколько я понимаю, отображение теней выполняется путем рендеринга сцены с точки зрения света для создания карты глубины. Затем вы повторно визуализируете сцену с точки зрения камеры, и для каждой точки (фрагмент в GLSL) сцены вы вычисляете расстояние от нее до источника света; если он соответствует тому, что у вас есть на вашей карте теней, то он в свете, иначе он в тени.

Я просто читал этот учебник, чтобы понять, как выполнять отображение теней с помощью точки / всенаправленный свет.

В разделе 12.2.2 говорится:

Мы используем единую карту теней для всех источников света

А затем под 12.3.6 он говорит:

1) Рассчитайте квадрат расстояния от текущего пикселя до источника света.
...
4) Сравните рассчитанное значение расстояния с полученным значением карты теней, чтобы определить, находимся мы в тени или нет.

Это примерно то, что я сказал выше.

Чего я не понимаю, так это того, что если мы запекли все наши источники света в одну карту теней, то с каким светом нам нужно сравнить расстояние? Расстояние, запеченное в карту, не должно ничему соответствовать, потому что это смесь всех источников света, не так ли?

Я уверен, что что-то упустил, но, надеюсь, кто-нибудь сможет мне это объяснить.


Кроме того, если мы используем одну карту теней, как нам смешать ее для всех источников света?

Для одного источника света карта теней просто хранит расстояние от ближайшего объекта до источника света (то есть карта глубины), но для нескольких источников света что она будет содержать?


person mpen    schedule 12.03.2012    source источник


Ответы (1)


Вы преждевременно оборвали предложение:

Мы используем одну карту теней для всех источников света, создавая изображение с многопроходным рендерингом и выполняя один проход для каждого источника света.

Таким образом, карта теней содержит данные для одного источника света за раз, но они используют только одну карту, потому что они визуализируют только один источник света за раз.

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

Вы также обычно применяете тест «пиксель горит, если он меньше или равен расстоянию в теневом буфере плюс немного», а не точно равен, из-за накопления ошибок округления с плавающей запятой.

person Tommy    schedule 12.03.2012
comment
Я думал, что остальная часть этого предложения просто означает, что они построили карту теней путем рендеринга на одну и ту же карту (возможно, аддитивно) для каждого источника света; не то, чтобы они его очищали и использовали повторно. Теперь это имеет больше смысла ... хотя жаль - я действительно надеялся, что смогу обойтись одной картой теней: p - person mpen; 12.03.2012
comment
У вас вроде получится, если вы перевернете все и воспользуетесь тем, что часто называют отложенным рендерингом. Вы визуализируете сцену с камеры, чтобы вывести глубину + нормали + некоторую информацию о поверхности на пиксель, а затем для каждого источника света вы рисуете полноэкранный квад, который эффективно повторяется через визуализацию камеры. Даже если ваш графический процессор может выводить только 8-битный RGBA (все еще распространенный в мобильном мире), вы можете сделать первый бит для нескольких текстур за несколько проходов. - person Tommy; 12.03.2012
comment
Здорово. Вы только что открыли для меня новую банку червей. Я делаю игру, и большинство объектов статичны (или редко меняются), поэтому я думал о предварительном вычислении карт теней для всех статических объектов, сохранении копии и обновлении ее только для движущихся объектов. Я хочу поддерживать как можно больше источников света, поэтому не думаю, что 100-кратный повторный рендеринг сцены под разными углами 60 раз в секунду - это для меня возможность. Но карта теней использует активную текстуру, не так ли? Я должен связать их все сразу для финального прохода рендеринга, не так ли? - person mpen; 12.03.2012
comment
Последним проходом должны быть только те источники света, которые еще не накопились в буфере кадра. Если ваши объекты и источники света были полностью статичными и у вас достаточно места для хранения, вы могли бы подготовить частичные карты освещения, состоящие только из статических объектов, к которым добавлялись другие в каждом кадре. Хотя это звучит так, как будто отложенный режим может быть быстрее, особенно если у любого из ваших источников света есть отрезки расстояния в пределах кадра (в этом случае их не нужно применять к каждому пикселю). - person Tommy; 12.03.2012