Przejdź do zawartości

Rasteryzacja

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

Rasteryzacja – działanie polegające na jak najwierniejszym przedstawieniu płaskiej figury geometrycznej na urządzeniu rastrowym, dysponującym skończoną rozdzielczością. Działaniem odwrotnym do rasteryzacji jest wektoryzacja.

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 (np. płaty Béziera) 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łniania trójkątów oraz czworokątów wypukłych, 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 (antyaliasingu z ang. antialiasing), które powodują usunięcie tzw. „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, lecz finalny efekt lepszy).

Rasteryzacja w grafice 3D

[edytuj | edytuj kod]

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 i Przeniesienie na płaszczyznę monitora dwóch pierwszych jest proste, gdyż wystarczy skopiować ich wartości. Większy problem występuje w przypadku trzeciej współrzędnej, której wyświetlacz, jako powierzchnia płaska, nie posiada. Jest to zmienna 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 pierwszym przypadku daje to 65 536, a w ostatnim aż 4 294 967 296 możliwych pozycji obiektu. Należy jednak wpierw określić, czy dany piksel obiektu ma być w ogóle narysowany. Takiego określenia dokonuje się na podstawie testu głębokości, a polega on na sprawdzeniu współrzędnej 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 w danej pozycji 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 (zadanie to realizuje układ bramek logicznych procesora karty graficznej). W kartach graficznych etap ten realizowany może być za pomocą dwóch technik: metody bufora Z lub renderingu kafelkowego.

Najprościej test głębokości można zrealizować poprzez rysowanie na ekranie obiektów od najbardziej oddalonego, wtedy kolejne jego piksele będą przesłaniane przez piksele obiektów znajdujących się bliżej. To rozwiązanie posiada jednak potężną wadę – każdy piksel każdego obiektu zostanie odwzorowany na ekranie (mimo że może być później zastąpiony innym), a co za tym idzie, metoda ta jest bardzo kosztowna czasowo. 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 (ang. Binary Space Partitioning – binarne dzielenie przestrzeni) lub tzw. technikę portali – odcinającą zasłonięte elementy sceny. Faktem jest, że niejednokrotnie programista nawet nie musi się martwić o realizację testu głębokości, gdyż karta graficzna poprzez swoje sterowniki i obsługę bibliotek graficznych wesprze wykonanie tego testu.

Najczęściej stosowaną techniką, zarówno w akceleratorach firmy AMD, jak też nVidii, jest wykorzystanie bufora Z. Metoda ta polega na tym, iż podczas przekształcenia sceny zawierającej obiekty trójwymiarowe na obraz płaski, możliwy do wyświetlenia na monitorze, w pamięci RAM akceleratora wydzielany jest obszar pamięci (matryca), który swoim rozmiarem dorównuje rozdzielczości ekranu, natomiast jego „głębokość” wynosi 16, 24 lub 32 bity – w zależności od rozdzielczości współrzędnej Z. Ten właśnie obszar nosi nazwę bufora Z (ang. Z-buffer) i może zajmować duże przestrzenie pamięci RAM karty graficznej, zwłaszcza przy wyższych rozdzielczościach ekranu i głębi rasteryzowanej sceny. Przy jego wykorzystaniu odbywa się analiza odległości wszystkich obiektów i punktów od obserwatora.

Zastosowanie bufora Z

[edytuj | edytuj kod]

Podczas rasteryzacji każdego z wielokątów (zwykle 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 pozycjach wielokątów (a dokładniej położeniu ich rzutów perspektywicznych) z których zbudowana jest scena 3D. Informacje te są następnie zamieniane na dane o pikselach ekranu, czyli ściślej, jaki kolor ma mieć piksel, który zapali się na wyświetlaczu w pozycji – te informacje gromadzone są w buforze ramki.

Wpierw do Z-bufora trafiają wszystkie współrzędne punktów należących do pierwszego analizowanego wieloką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 się pokrywają, sprawdza się współrzędną Jeśli nowy punkt ma wartość tej współrzędnej niższą (0 oznacza warstwę najpłytszą, najbliższą obserwatorowi), jest on umieszczany w buforze ramki; w przeciwnym wypadku pozostaje tam piksel pochodzący z wcześniej analizowanego wielokąta. Cały ten proces powtarzany jest dla każdego obiektu znajdującego się na generowanej scenie 3D.

Zobacz też

[edytuj | edytuj kod]