Понимание теневых прыщей лучше - PullRequest
1 голос
/ 08 ноября 2019

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

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

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

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

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

1 Ответ

2 голосов
/ 08 ноября 2019

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

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

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

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

enter image description here

с near = 1 и far = 1000

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

Ence, если значения thoose 2 сопоставлены с 0.9995 в карте глубины из-за точностиошибка. Когда вы вычислите тест глубины, один из них потерпит неудачу, вызвав 0,9995 <0,9957. </p>

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

enter image description here

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

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

...