Inne
Artykuł
Maciej Zabłocki, Sobota, 9 września 2017, 16:30

Wygładzanie krawędzi – jak to działa?

Już wiecie, że podczas rasteryzacji obiektów zostaną podświetlone te piksele, które znajdują się w obrębie danej bryły, co prowadzi do wyświetlenia „poszarpanych” krawędzi. Wymyślono przeróżne sposoby ich wygładzania. Można po prostu zwiększyć rozdzielczość, a co za tym idzie – liczbę pikseli. W popularnej rozdzielczości Full HD jest 2 073 600 pikseli (ponad 2 miliony), ale w 4K ich liczba zwiększa się do 8 294 400 (8,3 miliona), czyli jest ich dokładnie cztery razy więcej, co skutkuje, w naturalny sposób, mniej poszarpanymi krawędziami.

To bardzo wymagający proces dla układu graficznego. Dlatego na przykład twórcy gier na konsole stosują różne sztuczki, które pozwalają osiągnąć na ekranie 4K jakość obrazu zbliżoną do 4K bez renderowania sceny w tak wysokiej rozdzielczości. Przeczytacie o tym w naszym teście PlayStation 4 Pro.

Wygładzanie krawędzi (ang. antialiasing) polega na odpowiedniej regulacji koloru pikseli w taki sposób, by obok pikseli składających się na daną linię znalazły się piksele jaśniejsze od nich albo ciemniejsze (w zależności od wymagań), które będą się „zlewać” kolorystycznie z bezpośrednim otoczeniem obiektu.

Niestety, takie działanie skutkuje delikatnym rozmyciem obrazu, co prowadzi do utraty ostrości. To wymusiło opracowanie przeróżnych technik wygładzania krawędzi, na przykład przez zastosowanie różnych miar odległości jaśniejszego lub ciemniejszego piksela od docelowego obiektu. Zasadę działania technik wygładzania krawędzi świetnie pokazuje poniższy obrazek: 

Istnieje szereg metod wygładzania krawędzi, począwszy od standardowej techniki FSAA (ang. full screen antialiasing) poprzez MSAA i MFAA po SMAA i CMAA. Ich dokładne działanie, zalety i wady przedstawię w innym artykule. Na razie chciałbym, żebyście zrozumieli zasadę i wiedzieli, w jaki sposób można wygładzić obraz rastrowy. 

Dokładny proces rasteryzacji składa się z kilku elementów

Podczas rasteryzowania GPU wykonuje kilka kolejnych kroków, które pozwalają wyświetlić obraz na ekranie monitora. Można to określić jako obliczenie koloru RGB wszystkich pikseli wyjściowego obrazu i umieszczenie ich w buforze ramki. Najpierw przygotowuje się dane wielokątów (poligonów), potem się je wypełnia, wtedy następuje cieniowanie pikseli, a na samym końcu – łączenie zebranych danych. Podczas wypełniania wielokątów karta graficzna uwzględnia także to, które obiekty znajdują się bliżej obserwatora (kamery), co doskonale pokazuje poniższy obrazek: 

Łączenie danych polega na obliczeniu koloru RGB pikseli na podstawie fragmentów poszczególnych wielokątów. Karta graficzna najpierw umieszcza dane w buforze ramki, oblicza widoczność (bufor Z), potem przezroczystość (kanał alfa), następuje mieszanie za pomocą bufora szablonu (ang. stencil buffer), wykorzystanie bufora akumulacyjnego (ang. accumulation buffer), a na samym końcu – podwójnego buforowania (ang. double buffering). Pokrótce wytłumaczę, o co tutaj chodzi, bo te określenia mogą przerazić. 

Często spotykamy się z pojęciem podwójnego lub potrójnego buforowania w grach. Zmiana tej wartości nie ma przełożenia na jakość wyświetlanego obrazu. Podwójne buforowanie jest techniką programistyczną służącą do wytworzenia w pamięci GPU dwóch buforów o tym samym rozmiarze do przechowywania informacji o obrazie. Podczas gdy pierwszy bufor wyświetla jedną klatkę obrazu, drugi rysuje już następną. W ten sposób można zwiększyć wydajność generowania kolejnych klatek, a więc przyspieszyć działanie gry. Podwójne buforowanie redukuje też liczbę artefaktów na ekranie. 

Dzięki potrójnemu buforowaniu karta graficzna dysponuje dodatkowym, trzecim buforem, w którym rysuje kolejną klatkę animacji. Pozwala to jeszcze skuteczniej unikać artefaktów obrazu w postaci rozerwanych klatek (tzw. tearing). W tym pomaga V-Sync, G-Sync lub jedna z pozostałych technik synchronizacji pionowej, o których wspomnę przy innej okazji.

Technika bufora Z, jak można wywnioskować na podstawie nazwy, polega na zapamiętaniu rozmieszczenia pikseli zgodnie z wartością osi z. Obecnie stosuje się 32-bitowe bufory Z. Bufor szablonu zawiera dane o pojedynczym pikselu, zapisane w postaci liczb całkowitych, wykorzystywane do zwiększania kontroli nad tym, które piksele właśnie są renderowane. Ułatwia to GPU przygotowanie danej sceny. 

Teraz łatwiej będzie Wam zrozumieć, jak powstaje taka scena

Technika renderowania obrazu jest złożona i wymagająca, ale podstawowym zamysłem tego artykułu było pokazanie, czym jest rasteryzacja i jaką funkcję pełni w procesie tworzenia klatki animacji w grze komputerowej. Z chęcią rozwinę kolejne związane z tym zagadnienia, w tym ideę efektów postprocesowych. Następny artykuł z serii „Jak to działa?” już niebawem! Oczywiście, czekam na Wasze komentarze. 

Ocena artykułu:
Ocen: 20
Zaloguj się, by móc oceniać
agent_x007 (2017.09.09, 16:42)
Ocena: 12

0%
Świetny artykuł :)
Wreszcie coś technicznego, a nie tylko testy i recenzje.
Tak na przyszłość :
Będzie porównanie Tile based rendering vs. Immediate-mode rendering (tj. Maxwell/Vega vs. Kepler/Polaris) ?
Edytowane przez autora (2017.09.09, 16:42)
Putout (2017.09.09, 16:47)
Ocena: 7

0%
Technik wygładzania jest od grzmota. Mam nadzieję że dacie też jakieś testy wydajności i jakości technik
GranatXD (2017.09.09, 21:30)
Ocena: 2

0%
Łoo! Super artykuł!
Filip454 (2017.09.10, 01:24)
Ocena: 3

100%
Na PCL wyrastają coraz lepsze artykuły, niczym grzyby po deszczu (po ostatniej sekcji komentarzy użytkowników na temat PCLab w rocznicowym artykule).

Jest bardzo fajnie ;)
ReznoR (2017.09.10, 11:34)
Ocena: 7

0%
Całkiem niezły artykuł, ale jednak nie do końca łatwo jest podążać tokiem rozumowania piszącego - zbyt dużo nazw (czasem brak angielskich odpowiedników, nie wszędzie są - np. culling, mapping) przy zbyt małej ilości łatwej do przyswojenia teorii. Inaczej mówiąc - dużo żargonu, mało wyjaśniania 'o co kaman'. Nawet ja mogę się tutaj pogubić, a co dopiero ci bardziej początkujący czytelnicy. Podczas czytania ciągle miałem wrażenie że w teście jednej ze starszych mikroarchitektur NVidii, kopę lat temu, proces rasteryzacji był przystępniej wyjaśniony - nie świadczy to dobrze. Przez to nie mogę niestety z czystym sumieniem nikomu zalinkować, głównie przez to, że nie jestem do końca pewien, dla jakiego typu czytelników był on napisany. Trochę szkoda...
Edytowane przez autora (2017.09.10, 11:38)
matekmz (2017.09.10, 11:44)

0%
ReznoR @ 2017.09.10 11:34  Post: 1093808
Całkiem niezły artykuł, ale jednak nie do końca łatwo jest podążać tokiem rozumowania piszącego - zbyt dużo nazw (czasem brak angielskich odpowiedników, nie wszędzie są - np. culling, mapping) przy zbyt małej ilości łatwej do przyswojenia teorii. Inaczej mówiąc - dużo żargonu, mało wyjaśniania 'o co kaman'. Nawet ja mogę się tutaj pogubić, a co dopiero ci bardziej początkujący czytelnicy. Podczas czytania ciągle miałem wrażenie że w teście jednej ze starszych mikroarchitektur NVidii, kopę lat temu, proces rasteryzacji był przystępniej wyjaśniony - nie świadczy to dobrze. Przez to nie mogę niestety z czystym sumieniem nikomu zalinkować, głównie przez to, że nie jestem do końca pewien, dla jakiego typu czytelników był on napisany. Trochę szkoda...

Dzięki za fajny komentarz! Wezmę to pod uwagę ;)
revcorey (2017.09.10, 18:29)
Ocena: 2

0%
hmm jak bym otworzył książkę do opengl, wyrzucił kod i większość tekstu. Mam mieszane uczucia, ale to lepsze niż test myszki.
MichagM (2017.09.10, 22:20)
Ocena: 3

0%
Taki ma być artykuł krótki i jasny.
Tak ma być ''J.Polski Techniczny'' a nie zwykły J.Polski
Drugi raz szacunek dla M.Zabłockiego
Zaloguj się, by móc komentować
Artykuły spokrewnione
Aktualności spokrewnione
Facebook
Ostatnio komentowane