Jak dokładnie obliczyć pokrycie nakładających się krzywych analitycznych?


10

Wygładzanie kształtów 2D sprowadza się do obliczenia ułamka piksela objętego kształtem. W przypadku prostych, nie nakładających się kształtów nie jest to zbyt trudne: przytnij kształt do prostokąta pikselowego i oblicz powierzchnię wynikową kształtu. Ale staje się trudniejsze, jeśli wiele kształtów zachodzi na ten sam piksel. Zwykłe zsumowanie obszarów może spowodować, że obliczone pokrycie będzie zbyt duże, jeśli pominie to, że jeden kształt pokrywa inny kształt. Na przykład zobacz sekcję Ograniczenia tego artykułu na temat renderowania czcionek . Możesz być również w sytuacji, gdy dwie krzywe pochodzą z różnych obiektów o różnych kolorach (więc nie chodzi o całkowite pokrycie połączenia dwóch kształtów, ale pokrycie każdego z osobna).

Jak by to było obliczone, gdybyś dbał o pełną dokładność? Nawet trudniejsze, jak dokładnie obliczyć pokrycie dla nakładających się kształtów niepoligonalnych, takich jak krzywe? Czy jest jakiś moment, w którym nie masz innego wyboru, jak wrócić do technik multisamplingowych lub stochastycznych?

Odpowiedzi:


10

Naprawdę nie ma dobrego sposobu na wykonanie tego skutecznie analitycznie we wszystkich przypadkach narożnych. Większość lub wszystkie komercyjne renderery 2D, które próbują wykonać analityczne obliczanie pokrycia, popełniają przewidywalne błędy, których nie robią metody wielopróbkowania.

Typowym problemem są dwa zachodzące na siebie kształty, które mają tę samą krawędź. Częstą sytuacją jest to, że kanały alfa sumują się do zbyt grubej krawędzi alfa, która lekko się aliasuje. Lub jeśli kształty mają różne kolory, system myli kolor tła. To jest bardzo denerwujące.

wizerunek

Zdjęcie 1 : Silnik renderujący myli zasięg i tworzy cienki biały kontur tam, gdzie nie powinien być żadnego konturu.

Drugi idealny zasięg to filtrowanie pudełkowe. Z pewnością możemy zrobić lepiej. Biorąc pod uwagę, że istnieje tak wiele specjalnych przypadków narożnych, które wymagałyby operacji logicznych na kształtach, aby zrobić poprawnie, super próbkowanie jest nadal lepsze. W rzeczywistości szacunki zasięgu można wykorzystać do skoncentrowania próbkowania tam, gdzie jest to najprawdopodobniej potrzebne.

Sytuację można uprościć do wielokątów na poziomach subpikseli, a następnie można rozwiązać dyskretne rozwiązanie analityczne. Ale to kosztem elastyczności. Na przykład nie jest wykluczone, że przyszłe systemy wektorowe mogą chcieć uwzględniać rozmyte linie o zmiennej szerokości, które stanowią problem dla rozwiązań analitycznych, podobnie jak inne obiekty o różnych kolorach.

Jak to zrobić analitycznie

Scena analityczna

Zdjęcie 2 : Załóżmy, że masz tę scenę, widok rozstrzelony po prawej stronie

Teraz nie możesz tego po prostu zrobić analitycznie, każdy kawałek osobno, a następnie scalić dane. Ponieważ powoduje to nieprawidłowe dane. Zobacz, jak mieszanie alfa pozwoliłoby niebieskiemu świecić przez luki, gdybyś to zrobił.

To, co musisz zrobić, to podzielić scenę, aby każdy kształt eliminował to, co jest pod drugim:

wprowadź opis zdjęcia tutaj

Zdjęcie 3 : Musisz wyciąć leżące poniżej powierzchnie.

Teraz, jeśli wszystko jest nieprzejrzyste, to wszystko jest proste. wystarczy obliczyć powierzchnię każdego elementu i pomnożyć to przez kolor i zsumować je razem. Teraz można użyć coś jak ten .

Wszystko się psuje, jeśli twoje indywidualne kształty nie są nieprzejrzyste, ale nawet to można zrobić na pewnym poziomie.

Zapamiętaj:

  • Obliczenia AA należy wykonać w liniowej przestrzeni kolorów i przekonwertować z powrotem na przestrzeń użytkową.

Powiedz, że nie zależy nam zbytnio na wydajności. Jak poszlibyśmy robić obliczenia pokrycia operacji logicznych na kształtach? Czy jest to w ogóle możliwe, czy tylko dla określonych kształtów?
John Calsbeek,

@JohnCalsbeek ok, zaczynam budować odpowiedź analityczną, zajmie to trochę czasu
joojaa
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.