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

StackOverflow https://stackoverflow.com//questions/9660959

Вопрос

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

Я просто читал через Это учебное пособие , чтобы получить представление о том, как сделать карту тень точка / всенаправленный свет.

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

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

а затем до 12.3,6 написано:

1) Рассчитайте квадратное расстояние от текущего пикселя до источника света.

...
4) Сравните расчетное значение расстояния с полученной ценностью карты тени, чтобы определить, мы в тени или нет.

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

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

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


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

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

Это было полезно?

Решение

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top