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
Ence, если значения thoose 2 сопоставлены с 0.9995 в карте глубины из-за точностиошибка. Когда вы вычислите тест глубины, один из них потерпит неудачу, вызвав 0,9995 <0,9957. </p>
Другая проблема может возникнуть из-за того, что shadowMap слишком мал для вашей фактической точки зрения камеры (псевдоним перспективы).
Как вы можете видеть на этих снимках, сторона дерева занимает больше места с точки зрения камеры, чем в sadowMap. Есть больше пикселей, которые покрывают сторону дерева на экране, чем в shadowMap, так как некоторые пиксели, которые вы вычисляете в точке обзора камеры, будут использовать ту же информацию глубины в lightPoint зрения, некоторые тесты могут указывать на одну и ту же теньКарта пикселя и будет фай. d > ds
Добавление смещения в обоих случаях устранит ошибку с плавающей запятой или компенсирует ошибку, когда 2 точки проверки глубины указывают на один и тот же пиксель shadowMap. Добавление смещения можно рассматривать как предел погрешности. С уклоном вы принимаете некоторые тесты, которые были отклонены до