GRAFIKA KOMPUTEROWA 10: Antyaliasing
Transkrypt
GRAFIKA KOMPUTEROWA 10: Antyaliasing
Akademia Górniczo - Hutnicza Wydział Inżynierii Metali i Informatyki Przemysłowej ul. Adama Mickiewicza 30, 30-059 Kraków GRAFIKA KOMPUTEROWA 10: Antyaliasing http://galaxy.agh.edu.pl/~mhojny Prowadzący: dr inż. Hojny Marcin Akademia Górniczo-Hutnicza Mickiewicza 30 30-059 Krakow pawilon B5/p.406 tel. (+48)12 617 46 37 e-mail: [email protected] Akademia Górniczo - Hutnicza Wydział Inżynierii Metali i Informatyki Przemysłowej ul. Adama Mickiewicza 30, 30-059 Kraków 1. Cel projektu: Zapoznanie się z technikami usuwania efektu aliasingu. 2. Zadanie projektowe: Zaprojektować aplikację która: rysuje trzy punkty o tej samej wielkości oraz trzy linie o różnej szerokości stosując trzy poziomy jakości renderingu: GL_FASTEST - najwyższa wydajność renderingu, GL_NICEST - najwyższa jakość obrazu, GL_DONT_CARE - ustawienia domyślne. Program powinien umożliwiać włączenie i wyłączenie antyaliasingu punktów oraz wybór jakości renderingu punktów. 3. Antyaliasing Techniki usuwające efekt aliasingu, nazywane antyaliasingiem lub wygładzaniem krawędzi, sprowadzają się najczęściej do rozbudowania rasteryzacji obiektów o dodatkowe piksele „uzupełniające” brzegi obiektu lub procesie nadpróbkowania, czyli przeprowadzaniu rasteryzacji w większej niż docelowa rozdzielczości i następującym po tym odpowiednim skalowaniu. Problem aliasingu w grafice rastrowej dotyczy prawie wszystkich krzywych (z wyjątkiem poziomo i pionowo ułożonych linii których grubość jest równa wielokrotności pojedynczego piksela). Wyświetlana czarna skośna linia prosta na białym tle bez użycia antyaliasingu będzie składał się z czarnych pikseli na białym i będzie widoczna w sposób nierówny/schodkowy (rys.1). Antyaliasing może polegać na uzupełnieniu obrazu o piksele o jasności proporcjonalnej do odległości ich środków od idealnej prostej. W takim rozwiązaniu piksel, przez którego środek przechodzi linia będzie czarny, a piksel dalszy od niej w odpowiednim stopniu szary, bądź Akademia Górniczo - Hutnicza Wydział Inżynierii Metali i Informatyki Przemysłowej ul. Adama Mickiewicza 30, 30-059 Kraków całkiem biały (w wypadku pikseli, których linia nie przecinała). Efektem końcowym będzie złudzenie że linia jest dużo gładsza, ale będzie "rozmazana" (rys.1). Ze względu na konieczność uzyskania rozsądnego kompromisu między gładkością a rozmyciem stosuje się różne techniki zaniku jasności, oparte np. na różnych miarach odległości. Ze względu na brak obiektywnych metod porównywania efektów zastosowania tych technik, właściwy efekt najczęściej otrzymuje się poprzez eksperymenty. Rys.1. bez antyaliasingu Rys.2. z antyaliasingiem 4. Antyaliasing - implementacja w OpenGL Wybór jakości renderingu umożliwia funkcja: void glHint( GLenum target, GLenum mode ) Parametr target określa, jakość którego z elementów renderingu będzie regulowana. Przykładowe parametry: GL_LINE_SMOOTH_HINT - jakość antyaliasingu linii, GL_POINT_SMOOTH_HINT - jakość antyaliasingu punktów, Akademia Górniczo - Hutnicza Wydział Inżynierii Metali i Informatyki Przemysłowej ul. Adama Mickiewicza 30, 30-059 Kraków GL_POLYGON_SMOOTH_HINT - jakość antyaliasingu wielokątów. Parametr mode określa poziom jakości renderingu. Dopuszczalne są trzy wartości: GL_FASTEST - najwyższa wydajność renderingu, GL_NICEST - najwyższa jakość obrazu, GL_DONT_CARE - ustawienia domyślne. Antyaliasing punktów: Antyaliasing punktów jest domyślnie wyłączony w OpenGL. Aby go włączyć należy wywołać funkcję glEnable z parametrem GL_POINT_SMOOTH. Dodatkowo trzeba włączyć mieszanie kolorów oraz określić parametry równania mieszania kolorów przy użyciu funkcji glBlendFunc: glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) Informacje o możliwościach implementacji biblioteki OpenGL w zakresie renderingu punktów określają następujące zmienne stanu, których wartości można pobrać używając funkcji z grupy glGetFloatv: GL_POINT_SIZE_RANGE - minimalny i maksymalny rozmiar punktów określany przy pomocy funkcji glPointSize, GL_POINT_SIZE_GRANULARITY - krok z jakim może być zmieniana wielkość punktu, W wersji 1.2 biblioteki OpenGL zostały rozdzielone: GL_SMOOTH_POINT_SIZE_RANGE - minimalny i maksymalny rozmiar punktów z włączonym antyaliasingiem; stała ta ma taką samą wartość jak GL_POINT_SIZE_RANGE, GL_SMOOTH_POINT_SIZE_GRANULARITY - krok z jakim może być zmieniana wielkość punktu z włączonym antyaliasingiem; stała ta ma taką samą wartość jak GL_POINT_SIZE_GRANULARITY, GL_ALIASED_POINT_SIZE_RANGE - minimalny i maksymalny rozmiar punktów bez antyaliasingu. Akademia Górniczo - Hutnicza Wydział Inżynierii Metali i Informatyki Przemysłowej ul. Adama Mickiewicza 30, 30-059 Kraków Antyaliasing linii: Domyślnie antyaliasing linii jest wyłączony. Zastosowanie antyaliasingu linii podobnie jak antyaliasingu punktów sprowadza się do wywołania funkcji glEnable z parametrem GL_LINE_SMOOTH wraz z włączeniem mechanizmu mieszania kolorów z takimi samymi ustawieniami jak przy antyaliasingu punktów. Dopuszczalne parametry rysowania linii, które można odczytać z następujących zmiennych stanu: GL_LINE_WIDTH_RANGE - minimalna i maksymalna szerokość linii, GL_LINE_WIDTH_GRANULARITY - dopuszczalny krok pomiędzy szerokością linii. W wersji 1.2 biblioteki OpenGL zostały zastąpione: GL_SMOOTH_LINE_WIDTH_RANGE - minimalna i maksymalna szerokość linii z antyaliasingiem; stała ta ma taką samą wartość jak GL_LINE_WIDTH_RANGE, GL_SMOOTH_LINE_WIDTH_GRANULARITY szerokością linii z antyaliasingiem; stała ta dopuszczalny ma taką krok samą pomiędzy wartość jak GL_LINE_WIDTH_GRANULARITY, GL_ALIASED_LINE_WIDTH_RANGE - minimalna i maksymalna szerokość linii bez antyaliasingu. 5. Co na następnych zajęciach: Krzywe Beziera