Как использовать одну карту теней для нескольких точечных источников света? - PullRequest
7 голосов
/ 12 марта 2012

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

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

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

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

А затем в 12.3.6 написано:

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

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

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

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


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

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

1 Ответ

5 голосов
/ 12 марта 2012

Вы преждевременно сократили предложение:

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

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

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

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

...