Лучше понять тени от прыщей

В настоящее время я изучаю карту теней отсюда.

Я пытаюсь понять, почему вообще возникают теневые угри, я пробовал просматривать все видео / ресурсы, которые нашел в Интернете, некоторые связывают проблему с ошибками округления с плавающей запятой, другие говорят, что это размер карты теней и если бы он мог быть бесконечно большим, то этой проблемы бы не было,
но ни одно из объяснений, которые я видел, не связано с тем, почему я вижу этот "паттерн странной линии":

Некоторые объяснения даже включают в себя какой-то абстрактный рисунок, который может визуально соотноситься с явлением на экране, но на самом деле не объясняет основную причину, по которой это происходит:

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

Также после того, как я надеюсь понять причину этого, я хотел бы знать, как смещение / отбраковка лица помогает решить эту проблему и как они обменивают эту проблему на проблему Питера Пеннинга, поскольку я думаю, что нет четкого объяснения, почему это происходит вместо этого.

1 ответ

Решение

Shadow Acnee может возникать по разным причинам.

Первый - проблема с точностью вашей карты теней и фактической глубиной, которую вы вычисляете в своем шейдере. Глубина, которую вы храните в своей карте глубины, отображается на основе[near, far] к [0, 1].

Вы переходите от линеаризованного значения с плавающей запятой в 32 бита в [near, far] диапазон до нелинейной глубины (точнее, чем ближе вы от 0) в [0, 1]диапазон хранится примерно в 24 битах. Другими словами, какое-то значение глубины, вычисленное вами в фрагментном шейдере, будет сопоставлено с тем же "цветом текстуры", что приведет к сбою теста глубины.

Например с данной формулой

с near = 1 а также far = 1000

F(700) = 0.99957, F(701) = 0.99948 ~= 0.9995 

Возможно, если эти 2 значения сопоставлены с 0,9995 на карте глубины из-за ошибки точности. Когда вы вычислите тест глубины, один из них не сработает, так как 0,9995 < 0,9957.

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

Как вы можете видеть на этих изображениях, сторона дерева занимает больше места в поле зрения камеры, чем на sadowMap. Есть больше пикселей, которые покрывают сторону дерева на экране, чем в shadowMap, поскольку некоторые пиксели, которые вы вычисляете в точке обзора камеры, будут использовать ту же информацию о глубине в lightPoint of view, некоторые тесты могут указывать на ту же тень карта пиксель и будет fai.d > ds

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

Другие вопросы по тегам