Tak, jest to problem precyzyjny. Naprawdę nie jest to problem pływacki, tylko skończona precyzja.
Teoretycznie mapa cienia zapisuje "odległość do najbliższego obiektu od światła". Ale w praktyce przechowuje "odległość ± eps od światła".
Następnie, podczas testowania, masz odległość od siebie do tego samego światła. Ale znowu, w praktyce ± eps2. Więc jeśli porównasz te dwie wartości, okaże się, że eps zmienia się różnie podczas interpolacji dla renderowania lub cieniowania mapy w tle. Więc jeśli porównasz d ± eps < d2 ± eps2
, jeśli d2==d
, możesz otrzymać nieprawidłowy wynik, ponieważ eps!=eps2
. Ale jeśli porównasz d ± eps < d2 + max(eps) + max(eps2) ± eps2
, wszystko będzie dobrze.
W tym przykładzie . To się nazywa samo cieniowanie. I można je łatwo naprawić za pomocą powyższego błędu lub po prostu nie testując przeciwko sobie w raytracing.
Jest o wiele trudniejszy w przypadku różnych obiektów, a gdy eps i eps2 znacznie się różnią. Jednym ze sposobów radzenia sobie z nim jest kontrola eps (http://developer.download.nvidia.com/SDK/10.5/opengl/src/cascaded_shadow_maps/doc/cascaded_shadow_maps.pdf). Lub można po prostu wziąć o wiele więcej próbek.
Aby spróbować odpowiedzieć na pytanie: Podstawową kwestią jest to, że odwzorowanie cienia porównuje idealne odległości. Ale te odległości nie są idealne, ale skwantowane. A skwantyzowane wartości są zwykle w porządku, ale w tym przypadku porównujemy je w dwóch różnych przestrzeniach.