Почему шейдерные карты работают в обратном направлении? - PullRequest
0 голосов
/ 25 июня 2018

В данный момент я изучаю шейдеры для отображения теней, и возникает один вопрос: почему мы сначала закрашиваем поверхности (ламберт / фонг), а затем наносим на них тени, а не просто подсвечиваемые пиксели?Это выглядит как противоположность тому, как должен работать свет.

Если мы используем отображение теней, это означает, что мы создали текстуру, которая сообщает нам, какие пиксели пространства экрана подвергаются воздействию источника света.Зачем нам тогда делать весь расчет Ламберта \ Фонга?Почему бы не получить освещение непосредственно из объединения теневых карт?

Вот псевдоалгоритм, который я вижу:

  1. Все пиксели выходного изображения по умолчанию полностью черные.
  2. Создание неосвещенной текстуры экрана альбедо
  3. Создание карты теней для источника света
  4. Изменение выходного изображения.Мы модифицируем только те пиксели, которые подвергаются воздействию светового потока (в соответствии с глубиной карты теней + - смещение, что угодно), делаем светлые пиксели более яркими в зависимости от интенсивности света, затухания и т. Д.
  5. Выбор следующего источника света
  6. Перейти к шагу 3

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

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

1 Ответ

0 голосов
/ 27 июня 2018

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

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

Кроме того, отображение теней само по себе является бинарной операцией, и вам необходимо накопить много выборок («отводов») или каким-то образом обработать вывод, чтобы получить полутени или любые промежуточные значения.

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

enter image description here

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

...