Rasteryzacja

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania
Przykład rasteryzacji odcinka, łuku oraz wielokąta
Antyaliasing: przykład rasteryzacji trójkąta

Rasteryzacja – w grafice komputerowej działanie polegające na jak najwierniejszym przedstawieniu płaskiej figury geometrycznej na urządzeniu rastrowym, dysponującym skończoną rozdzielczością.

Rasteryzacji mogą podlegać krzywe: odcinki, okręgi, elipsy, łuki eliptyczne, krzywe sześcienne, krzywe sklejane (np. Béziera), przekroje stożkowe oraz powierzchnie wielokątów, kół, powierzchnie zdefiniowane krzywymi sklejanymi itp.

Dla niektórych figur istnieją bardzo proste i efektywne algorytmy. W 1965 roku Bresenham opracował tzw. algorytm Bresenhama z punktem środkowym, działający na liczbach całkowitych, służący do konwersji dowolnych odcinków, okręgów oraz elips; algorytm był i jest implementowany sprzętowo. Podobnie rzecz ma się z wypełnianiem powierzchni – wypełnianie dowolnych wielokątów jest skomplikowane i kosztowne obliczeniowo, jednak istnieją bardzo efektywne algorytmy wypełniające trójkąty oraz czworokąty wypukłe, które są implementowane sprzętowo w akceleratorach 3D.

W najprostszych przypadkach, gdy urządzenie rastrowe jest dwukolorowe, algorytm rasteryzujący zapala piksele leżące najbliżej krzywej/wewnątrz figury.

Gdy docelowe urządzenie potrafi wyświetlać więcej kolorów (lub poziomów szarości), możliwe jest zastosowanie technik odkłócających (z ang. antyaliasingu), które powodują zniknięcie "schodków". W najogólniejszym przypadku intensywność koloru lub też stopień przezroczystości danego piksela jest proporcjonalny do pola powierzchni części wspólnej figury i piksela. Jeśli figura w całości pokrywa piksel, jego intensywność jest największa, gdy pokrywa tylko część – intensywność jest zmniejszana. Ta zależność może być liniowa (najmniejszy koszt obliczeniowy) albo nieliniowa (koszt większy, finalny efekt lepszy).

Rasteryzacja w grafice 3D[edytuj | edytuj kod]

Sprawa trochę bardziej komplikuje się jeśli mamy do czynienia z grafiką trójwymiarową. Pierwszym etapem przygotowania obrazu 3D do wyświetlenia na ekranie jest pozbycie się zbędnego - trzeciego - wymiaru. W obrazie 3D każdy punkt posiada swoje współrzędne x, y i z. Przeniesienie na płaszczyznę monitora dwóch pierwszych jest proste, gdyż wystarczy skopiowanie ich wartości. Większy problem występuje w przypadku trzeciej współrzędnej, której monitor jako takiej nie posiada. Jest to zmienna z odpowiadająca za głębokość punktu, czyli za jego położenie "w głąb ekranu". Zazwyczaj w grach i programach do tworzenia grafiki 3D wykorzystuje się 16-, 24- lub 32-bitową głębię. W tym pierwszym przypadku daje to 65 536, a ostatnim już 4 294 967 296 możliwych pozycji obiektu. Należy wyznaczyć, czy dany piksel obiektu zostanie narysowany. Takie wyznaczenie dokonuje się na podstawie testu głębokości. Polega on na sprawdzeniu współrzędnej z obiektu i jego punktów. Następnie podejmowana jest decyzja, czy dany piksel powinien zostać narysowany na ekranie, czy może jest już inny piksel, który został narysowany na danej pozycji X,Y a znajduje się perspektywicznie bliżej obserwatora, a co za tym idzie przesłania ten piksel. Test głębokości można wykonywać w różny sposób - zarówno programowo (aplikacja analizuje położenie punktów zgodnie z algorytmem opracowanym przez programistę), jak i sprzętowo. W kartach graficznych etap ten realizowany jest za pomocą dwóch wspieranych hardware'owo technik: metody Z-bufora i renderingu kafelkowego. Najłatwiej można to zrealizować poprzez rysowanie na ekranie obiektów od najgłębszego. Kolejne piksele będą przesłaniane przez bliższe. To rozwiązanie posiada jednak potężną wadę - każdy piksel zostanie odwzorowany na ekranie (mimo, że może być później zastąpiony innym), a co za tym idzie metoda ta jest bardzo czasochłonna. Aby ominąć ten problem i przyspieszyć wyświetlenie na ekranie grafiki trójwymiarowej, twórcy programów 3D, takich jak np. 3ds max czy Maya 3D, stosują własne algorytmy eliminacji niewidocznych punktów, m.in. BSP (Binary Space Partitioning - binarne dzielenie przestrzeni) lub tzw. technikę portali, odcinającą zasłonięte elementy sceny. Dodatkowo testy głębokości wspierane są automatycznie przez karty graficzne, więc programista nawet niejednokrotnie nie musi się o to martwić, gdyż karta samoczynnie wesprze testy głębokości.

Najczęściej stosowaną techniką zarówno w akceleratorach firmy ATI, jak też nVidii jest wykorzystanie Z-bufora. Podczas przekształcenia sceny zawierającej obiekty trójwymiarowę na obraz płaski, możliwy do wyświetlenia na monitorze w RAM-ie akceleratora wydziela się obszar pamięci (matrycę) który swoim rozmiarem dorównuje rozdzielczości ekranu, natomiast "głębokością" 16, 24 lub 32 bitom w zależności od dokładności współrzędnej Z. Ten wygenerowany duży objętościowo (zwłaszcza przy większych rozdzielczościach) fragment pamięci nosi właśnie nazwę Z-bufora i tutaj właśnie odbywa się analiza głębokości dla wszystkich obiektów i punktów.

Przyjrzyjmy się zatem działaniu Z-bufora. Podczas rasteryzacji każdego z trójkątów tworzących szkielet sceny z nałożonymi na niego teksturami i mapą oświetlenia należy podjąć decyzję o tym, czy wybrany punkt znajduje się bliżej obserwatora (będzie wyświetlony) czy też jest zasłonięty przez inny obiekt i należy go zignorować. W Z-buforze znajdą się zatem informacje o pozycji trójkątów (a raczej położeniu ich rzutów perspektywicznych) z których zbudowana jest scena 3D. Informacje te są następnie zamieniane na dane o pikselach na ekranu, czyli ściśle, jaki kolor ma mieć piksel, który zapali się na monitorze na pozycji x,y. (te informacje gromadzi się w buforze ramki). Do Z-bufora trafiają zatem najpierw wszystkie współrzędne punktów należących do pierwszego analizowanego trójkąta. Gdy rasteryzowany jest drugi trójkąt, przed umieszczeniem informacji o nim w buforze ramki porównuje się jego współrzędne z wartościami zapamiętanymi w Z-buforze. Kiedy współrzędne X, Y się pokrywają, sprawdza się współrzędną Z. Jeśli nowy punkt ma wartość niższą (0 oznacza najpłytszą warstwę), jest on "rysowany" w buforze ramki. W przeciwnym wypadku pozostają tam "zapalone" piksele pochodzące z poprzedniego trójkąta. Cały proces powtarzany jest dla każdego obiektu generowanej sceny 3D.