Grafika Komputerowa (GRK)
Wykład I

Wiadomości ogólne

Grafika komputerowa, podobnie jak każda inna dziedzina ma pewne cechy charakterystyczne dla całej dziedziny. W wykładzie przedstawione są wybrane pojęcia i problemy istotne dla grafiki komputerowej jako całości. Szczegółowe metody grafiki komputerowej będą omawiane w następnych wykładach.

Obraz, podobnie jak każda inna informacja w komputerze, musi być przedstawiony w postaci cyfrowej. Obraz cyfrowy może być uzyskany w różny sposób. Może to być zdjęcie zrobione aparatem cyfrowym. Może to być skan jakiegoś dokumentu. Może to być rezultat obliczeń wykonanych metodami grafiki komputerowej - najczęściej przy wykorzystaniu jednej z wielu aplikacji ułatwiających generowanie obrazów.

Grafika komputerowa ma na celu generowanie nowych obrazów odpowiednich dla określonego zastosowania. W szczególności, jednym z zadań grafiki komputerowej jest generowanie obrazów cyfrowych o jakości możliwie najbardziej zbliżonej do obrazów obserwowanych w świecie rzeczywistym. Trzeba jednak pamiętać, że grafika komputerowa wykorzystuje wiele uproszczeń wynikających z konieczności dostosowania się do możliwości obliczeniowych dostępnego sprzętu oraz ograniczonych możliwości urządzeń wyświetlających (wymagania monitorów związane z częstotliwością wyświetlania obrazów, dostępną rozdzielczością, dostępną dynamiką jasności).

Obrazy cyfrowe mogą być przetwarzane w celu uzyskania innej postaci odpowiedniej dla określonego zastosowania, a w szczególności dla poprawy jakości. Przykładowe metody przetwarzania obrazów mogą polegać na zmianie rozdzielczości obrazu, zmianie kolorystyki obrazu, zmianie treści obrazu, wyróżnienia odpowiednich obszarów w obrazie, kompresji obrazów itd. Metody te są często wykonywane w fazie postprocesingu.

W grafice komputerowej wyróżnia się metody związane z grafiką płaską (2D), z grafiką przestrzenna (3D) oraz animacją.

W grafice 2D operuje się obiektami znajdującymi się na płaszczyźnie. Przykładowo są to linie proste, krzywe, figury płaskie, odręczne rysunki, teksty itd. Typowe operacje to rysowanie, wypełnianie wnętrz figur, przekształcenia geometryczne (przesuwanie, obroty, skalowanie), wymiarowanie itd. Cechą charakterystyczną jest brak problemów związanych z oświetleniem. Dostępnych jest wiele programów do grafiki 2D zawierających wiele różnych narzędzi ułatwiających tworzenie obrazów 2D. Dużą popularnością cieszą się profesjonalne edytory Corel Draw, Illustrator oraz darmowy Inkscape.

W grafice 3D tworzone są sceny z obiektami 3D. Istotnym elementem każdej sceny są źródła światła zapewniające odpowiednie oświetlenie obiektów i w konsekwencji konieczność wyznaczania barw powierzchni obiektów (tzw. cieniowanie powierzchni) oraz wyznaczanie cieni rzucanych przez te obiekty. Po zakończeniu procesu modelowania sceny, konieczne jest umieszczenie w scenie kamery, z punktu widzenia której zostanie wyznaczony dwuwymiarowy widok sceny 3D, który będzie mógł być wyświetlony na płaskim ekranie monitora. Proces przejścia ze sceny 3D na widok 2D określany jest jako rendering. Są różne sposoby realizacji renderingu. Najczęściej stosowane są dwa sposoby: obiektowy (koncepcja rasteryzacji) i obrazowy.

Przy podejściu obiektowym, w czasie renderingu wykonuje się takie operacje jak rzutowanie, określanie widoczności/zasłaniania obiektów, cieniowanie, rasteryzacja itd. Istotne jest to, że dla każdego obiektu wyznacza się jego wpływ na odpowiednie piksele (fragmenty). Znajomość fragmentów związanych z określonym pikselem pozwala wyznaczyć jego barwę końcową. Natomiast przy podejściu obrazowym, dla każdego piksela obrazu znajduje się wszystkie obiekty, które na niego wpływają i barwa piksela jest wyznaczana bezpośrednio. Sposób taki jest stosowany na przykład w metodzie śledzenia promieni. Wykorzystywane są tu inne algorytmy niż przy podejściu obiektowym. W szczególności nie występuje problem rasteryzacji.

Zarówno grafika 2D jak i grafika 3D stanowią podstawę dla tworzenia animacji czyli sekwencji obrazów, wchodzących w skład filmów mniej lub bardziej złożonych - poczynając od prostych reklam czy filmów animowanych dla dzieci a kończąc na filmach pełnometrażowych. W tych zastosowaniach sekwencje obrazów są generowane off-line i mogą być wyświetlane z wymaganą częstotliwością. Inaczej wygląda sytuacja w przypadku gier komputerowych czy też różnego rodzaju symulatorów, w których ze względu na wymaganą interakcję z użytkownikiem konieczne jest obliczanie kolejnych obrazów sekwencji na bieżąco.

Spośród wielu edytorów dla grafiki 3D oraz tworzenia animacji wymieńmy tu profesjonalny program 3D Studio Max oraz darmowy program Blender.

Zarówno w grafice 2D jak i w grafice 3D, w fazie generowania obrazów wykorzystuje się tzw. grafikę wektorową, charakteryzującą się tym, że wszystkie obiekty są opisywane w sposób matematyczny. Dla każdego obiektu podaje się pewien zestaw danych, na podstawie których, odpowiednie algorytmy pozwalają wygenerować cyfrowy obrazu takiego obiektu, który potem może być wyświetlony (rys. I.1). Grafika wektorowa umożliwia definiowanie i edycję każdego obiektu każdorazowo w pożądanej rozdzielczości.

Rysunek I.1

Rys. I.1. Ilustracja powiązań między grafiką wektorową, obrazem cyfrowym i wyświetlaniem

Jeżeli obraz jest w postaci cyfrowej to nie jest już dostępna informacja o obiektach, które składają się na ten obraz. W tym przypadku nie można wykonywać żadnych operacji na tych obiektach. Można jedynie wykonywać operacje na całym obrazie pikselowym, albo na pojedynczych pikselach lub grupach pikseli. Przy ewentualnej zmianie rozdzielczości obrazu trzeba się liczyć z pewną utratą jakości obrazu. Ponadto ilość pamięci potrzebnej dla zapisania gotowego obrazu cyfrowego najczęściej jest znacznie większa niż w przypadku grafiki wektorowej, gdzie pamięta się tylko informacje potrzebne dla uzyskania końcowego obrazu cyfrowego.

Ogólnie, proces generowania obrazów można podzielić na trzy etapy: modelowanie, rendering i wyświetlanie (rys. I.2).

Rysunek I.2

Rys. I.2. Podstawowe etapy procesu generowania cyfrowego obrazu

Etap modelowania obejmuje wszystkie obliczenia związane z generowaniem sceny z obiektami i ich parametrami, oświetleniem, kamerą.

Rendering obejmuje ciąg obliczeń prowadzących do uzyskania cyfrowego obrazu gotowego do wyświetlenia.

Faza wyświetlania zapewnia poprawne wyświetlenie obrazu na ekranie monitora.

Najczęściej proces modelowania nie jest wymagający obliczeniowo i może być realizowany przez jednostkę centralną systemu. Natomiast faza renderingu jest zdecydowanie bardziej wymagająca. W typowym systemie graficznym, w fazie renderingu, duża część obliczeń jest wykonywana w odniesieniu do wierzchołków obiektów wygenerowanych w fazie modelowania. Natomiast efektem końcowym obliczeń w fazie renderingu są informacje o barwach wszystkich punktów obrazu cyfrowego (pikseli), których jest wielokrotnie więcej niż w wejściowym ciągu wierzchołków. Ponadto obliczenia te muszą być wykonane w bardzo krótkim czasie określonym przez wymagania urządzenia wyświetlającego. W efekcie, spełnienie tych wymagań jest w praktyce często możliwe jedynie dzięki wykorzystania sprzętowego wspomagania obliczeń. Wspomaganie to zapewniają karty graficzne zawierające specjalizowane procesory graficzne (GPU). Równocześnie, bardzo ważna jest optymalizacja wykorzystywanych algorytmów z punktu widzenia czasu ich wykonania.

We współczesnych monitorach wykorzystywany jest tzw. rastrowy sposób wyświetlania. Na ekranie wyświetlane są kolejne piksele obrazu w sposób sekwencyjny (rys. I.3). Najpierw wyświetlane są piksele, jeden po drugim, w pierwszym wierszu, potem odpowiednio w drugim wierszu itd. aż do ostatniego wiersza. (Zwróćmy uwagę na istotną różnicę tego sposobu wyświetlania obrazu w porównaniu z kinem, gdzie kolejna klatka filmu jest wyświetlana od razu w całości.)

Rysunek I.3

Rys. I.3. Kolejność wyświetlania pikseli na ekranie monitora

Informacje o barwach pikseli są pobierane z pamięci obrazu. Z reguły, barwa piksela jest określana za pomocą trzech składowych R,G,B. Ogólna zasada wyświetlania barwnego piksela polega na wyświetlaniu obok siebie trzech niewielkich barwnych punktów, odpowiednio R, G i B. Taka trójka punktów obserwowana z pewnej odległości „zlewa” się w jeden barwny piksel (rys. I.4).

Rysunek I.4

Rys. I.4. Ilustracja sposobu generowania barwnych pikseli na ekranie. Z lewej strony pokazane są trzy małe elementy o barwach R,G,B a z prawej strony barwny piksel widziany z dostatecznie dużej odległości

Sposób wyświetlana trójek punktów zależy od rodzaju monitora. W monitorach CRT były to trzy plamki luminoforów R,G,B (tzw. triady) świecące po pobudzeniu strumieniami elektronów, w monitorach LCD są to trzy sąsiednie komórki LCD z filtrami R,G,B a w monitorach OLED są to trzy diody świecące składające się na piksel.

Zwróćmy uwagę na kilka aspektów, istotnych z punktu widzenia obliczeń związanych z obrazem cyfrowym i jego wyświetlaniem. Przede wszystkim istotna jest częstotliwość wyświetlania kolejnych obrazów. Problem wiąże się z tym, że przy zbyt małej częstotliwości występuje efekt migotania. Obecnie przyjmuje się, że częstotliwość wyświetlania powinna być nie mniejsza niż 70 - 80 Hz. Oznacza to, że czas wyświetlania jednego obrazu jest na poziomie kilkunastu milisekund. Jeżeli dodatkowo weźmiemy pod uwagę rozdzielczość pikselową obrazu, to okazuje się, że czas wyświetlenia jednego piksela jest na poziomie kilku nanosekund.

Przykład

Załóżmy, że monitor o rozdzielczości pikselowej 1920 x 1080 wyświetla obrazy z częstotliwością 80 Hz. Ile jest czasu na wyświetlenie jednego piksela?

Czas dostępny na wyświetlenie jednego obrazu wynosi

180Hz=12,5ms

Liczba pikseli do wyświetlenia (i obliczenia dla kolejnego obrazu) wynosi

1920x1080

Czas wyświetlania jednego piksela wynosi

12,5s1920x10806ns

Zauważmy, że jest to wartość przybliżona, bowiem w obliczeniach nie zostały uwzględnione czasy potrzebne na przechodzenie z wyświetlania jednego piksela do wyświetlania następnego piksela i przechodzenie z wyświetlania jednego obrazu do wyświetlania następnego obrazu.

W czasie wyświetlania danego obrazu obliczany jest kolejny obraz. Obliczenia te powinny zakończyć się przed zakończeniem wyświetlanego obrazu. Stąd czas obliczania kolejnego obrazu nie powinien być dłuższy niż wspomniane wyżej kilkanaście milisekund. Ponadto wskazane jest, żeby piksele nowego obrazu były zapisywane w innym bloku pamięci niż ten, z którego pobierane są informacje o aktualnie wyświetlanym obrazie. Stąd w praktyce wykorzystuje się koncepcję podwójnego bufora pamięci obrazu, działającego w ten sposób, że jeżeli wyświetlany jest obraz z jednego bufora to nowy obraz jest zapisywany do drugiego bufora. Po zakończeniu cyklu wyświetlania obrazu i obliczania nowego obrazu role buforów zamieniają się (rys. I.5). Metoda ta jest często określana jako metoda ping-pong.

Rysunek I.5

Rys. I.5. Podwójny bufor pamięci

Czasami, przy złożonych scenach, system nie nadąża z obliczeniami i jest w stanie wyliczyć mniej obrazów w ciągu sekundy niż wynikałoby to z wymagań monitora. Wtedy niektóre obrazy (klatki) mogą być wyświetlane dwukrotnie i generalnie pojawia się problem synchronizacji między możliwościami monitora wyświetlającego obrazy z określoną częstotliwością a możliwościami systemu obliczeniowego określanymi przez liczbę obliczanych klatek w ciągu sekundy (FPS).

W wykładzie poznaliśmy ogólne pojęcia i problemy typowe dla grafiki komputerowej. Znajomość tych zagadnień jest istotna dla zrozumienia dalszych wykładów. W szczególności, została zwrócona uwaga na wymagania czasowe w odniesieniu do obliczeń związanych z wyznaczaniem kolejnego obrazu i jego wyświetlania.

Przykładowe pytania i problemy do rozwiązania.
  1. Wyjaśnić różnice między grafiką 2D a grafiką 3D.
  2. Porównać grafikę wektorową z grafiką rastrową.
  3. Wyjaśnić zasadę wyświetlania rastrowego w monitorze.
  4. Wyjaśnić działanie podwójnego bufora pamięci obrazu.