Architektura Procesorów Graficznych Referat: „Rendering 3D: potok 3D, możliwości wsparcia sprzętowego, możliwości przyspieszenia obliczeń”. Grupa wyrównawcza Cezary Sosnowski 1. Renderowanie Renderowanie (z j. ang rendering tj. spowodować, zinterpretować) przedstawienie informacji zawartych w dokumencie elektronicznym w formie najbardziej właściwej dla danego środowiska (np. wizualnie, w tym na ekranie i w druku, czy dźwiękowo). 1.1 Renderowanie w Grafice Trójwymiarowej Renderingiem w grafice trójwymiarowej nazywa się proces przekształcenia danych trójwymiarowych w dane dwuwymiarowe. Przekształcenie polega na przeliczeniu danych wejściowych reprezentujących scenę graficzną, w wyniku czego powstaje obraz dwuwymiarowy: Dane wejściowe stanowią model opisujący trójwymiarowe obiekty w określonym języku programowania lub strukturze danych, zrozumiałej dla komputera renderującego. Opis może dotyczyć wielkości i koloru obiektów, oświetlenia, położenia obserwatora sceny, ruchu obiektów na scenie. W procesie renderowania uwzględniane są różne zjawiska fizyczne m.in. odbicia promieni, cienie, załamania światła, przezroczystość i inne zjawiska optyczne. Scena 3D: Obiekty 3D stanowią pewien fragment przestrzeni ograniczonej powierzchniami o różnym stopniu komplikacji. Chociaż każda taka powierzchnia da się jednoznacznie zdefiniować przy pomocy równań matematycznych, to ich przetwarzanie pochłonęło by całą dostępną moc obliczeniową. Zagadnienie 3D można w ogromnym stopniu uprościć rozkładając każdą z takich powierzchni na odpowiednio dużą (zależną od stopnia dokładności) liczbę wielokątów płaskich. Najprostszym z wielokątów jest trójkąt. Każdy z wierzchołków trójkąta jest jednoznacznie zawieszony w przestrzeni 3D przy pomocy trzech współrzędnych (x, y, z). Cały obiekt 3D przechowywany jest w spójnym fragmencie pamięci Scena 3D - budowa: - Geometria obiektów 3D - Materiały pokrywające obiekty: Kolor powierzchni obiektów; Tekstura; Własności powierzchni - Kamera - Źródło światła - Parametry środowiska (mgła, dym, itp.) Reprezentacja obiektów geometrycznych Sceny 3D: Reprezentacja wielokątowa: trójkąt( obiekt podstawowy), pasy wachlarze. Krzywe i powierzchnie Podstawowe etapy renderingu: przekształcenia (transformacje) sceny ustawienie źródeł światła rzutowanie na płaszczyznę usuwanie niewidocznych powierzchni obcinanie widoku przekształcenie widoku rasteryzacja – obliczenie barwy każdego piksela obrazu 2. Potok graficzny Proces renderingu polega na przeliczeniu danych reprezentujących trójwymiarową scenę. Efektem końcowym tej operacji jest obraz lub animacja dwuwymiarowa. Przekształcenie sceny 3D w 2 D nie odbywa się jednoetapowo. Składa się na to szereg operacji. Taka sekwencja przekształceń nazywa się potokiem graficznym. Przekształcenia te są kolejno stosowane do każdego obiektu na scenie, w wyniku czego otrzymuje się gotowe do włączenia na ekranie piksele obrazu końcowego. Pojedynczy potok jest w stanie obliczyć w jednym momencie kolor tylko jednego piksela. Współczesne karty graficzne wyposażone są w kilka potoków, np. GeFroce 8800 GTX zbudowanych jest z trzech 48-potokowych procesorów, co daję łączną liczbę 128 potoków na karcie graficznej. Większość operacji w potoku jest wspieranych sprzętowo, co dodatkowo przyspiesza proces renderingu. Typowy schemat potoku graficznego składa się z dwóch faz, przetwarzanych przez wyspecjalizowany procesor graficzny znajdujący się na karcie graficznej. Pierwszą fazą w potoku graficznym jest przetwarzanie geometrii. W fazie tej wyróżnia się kilka następujących po sobie operacji: transformacja geometrii, obliczenie oświetlenia, transformacja do układu kamery, rzutowanie, obcinanie, mapowanie i teksturowanie. Druga faza potoku graficznego to rasteryzacja. Wynikiem rasteryzacji jest końcowa scena 2D, gotowa do wyświetlenia na ekranie komputera. Współrzędne obiektów w potoku Przetwarzanie w potoku graficznym składa się ze zbioru operacji przekształcających współrzędne obiektów. Każde z przekształceń polega na transformacji współrzędnych z jednego układu współrzędnych w drugi, w taki sposób by ze współrzędnych wirtualnej sceny 3D otrzymać współrzędne ekranu urządzenia wyświetlającego. W przetwarzaniu potokowym wyróżnia się 5 różnych układów współrzędnych różniących się punktem odniesienia: współrzędne modelu (MCS - Modelling Coordinate System) – lokalny układ współrzędnych obiektu x, y, z współrzędne świata (WCS - World Coordinate System) – globalny układ współrzędnych x, y, z współrzędne kamery (VCS - Viewer Coordinate System) – punktem odniesienia jest kamera (obserwator sceny) współrzędne znormalizowane (NDCS - Normalized Device Coordinate System) – punktem odniesienia jest kamera, ale wszystkie współrzędne rzutowane są na jedną płaszczyznę współrzędne ekranowe (SCS - Screen Coordinate System) – puntkem odniesienia jest lewy górny róg ekranu Przestrzeń współrzędnych lokalnych x,y,z Definicja obiektu Przestrzeń współrzędnych świata Przestrzeń oka (kamery) Przestrzeń 3D ekranu xe, ye, ze xs, ys, zs Odrzuć (culling) Obetnij do bryły widzenia Usuwanie powierzchni niewidocznych Rasteryzacja Cieniowanie Przestrzeń wyświetlacza xw, yw, zw Skomponuj scenę Zdefiniuj kamerę Zdefiniuj światła Przekształcenia modelowania Przekształcenia widoku Przetwarzanie geometrii Procesy algorytmiczne xd, yd, zd Potok 3D Obliczenia wstępne Pierwszy etap potoku graficznego to obliczenia wstępne i przekształcenie informacji przez procesor wstępny (tzw. Setup Engine lub Input Assembler). Ten ostatni rozpoznaje typ danych, tj. bada, czy ma do czynienia z wektorami, obrazami, czy też kodem programu i odpowiednio przygotowuje informacje do dalszej obróbki. Transformacja geometrii Obejmuje operację transformacji i rotacji obiektów. Obiekt znajduje się w środku układu modelu. W wyniku transformacji jest przekształcany do położenia i kształtu docelowego. Transformacja geometrii dokonuje przekształcenia współrzędnych modelu (MCS) do współrzędnych świata (WCS). Jest to często spotykane podejście w grafice komputerowej. Obiekty są rysowane początkowo na środku układu współrzędnych, a potem przesuwane w docelowe miejsce na scenie. Obliczanie oświetlenia Scena 3D zawiera definicje świateł oraz powierzchni odbijających lub rozpraszających promienie świetlne. Obliczanie oświetlenia sceny polega na wyliczenia koloru i jasności poszczególnych elementów sceny. Transformacja do układu kamery Wszystkie wierzchołki obiektów transformowane są ze współrzędnych świata (WCS) do współrzędnych kamery - obserwatora sceny (VCS). Operacje tę zrealizować można za pomocą jednej transformacji i trzech obrotów (wokół każdej z osi układu współrzędnych). W wyniku transformacji do układu, kamera (obserwator) znajduje się w środku układu współrzędnych i „patrzy” w kierunku ujemnych wartości osi Z. Kamera patrzy w kierunku ujemnych wartości Z Rzutowanie Na tym etapie przetwarzania współrzędne kamery przeliczane są do współrzędnych znormalizowanych (NDCS). Współrzędne trójwymiarowe rzutowane są na dwuwymiarową płaszczyznę. Płaszczyznę można traktować jako wirtualny ekran urządzenia wyświetlającego. Rzutowanie odbywa się na zasadzie poprowadzenia prostej przechodzącej przez punkt trójwymiarowej sceny (punkt A) i miejsce usytuowania kamery (punkt C). Przecięcie prostej z płaszczyzną określa nowe współrzędne punktu (punkt A’) . Wirtualny ekran Kamera Schemat rzutowania Obiekt na scenie Obcinanie Kamera ma pewien określony kąt widzenia. Przeważnie jest on zbliżony do kąta, jaki widzi człowiek. W wyniku operacji rzutowania cześć nowych współrzędnych może znajdować się poza widokiem kamery (obserwatora). W celu przyspieszenia dalszych obliczeń odrzuca się wszystkie punkty, które nie znajdują się w polu wiedzenia kamery. Takie punkty nigdy nie zostaną wyświetlone na ekranie, więc nie ma potrzeby ich dalej przetwarzać (clipping). Operacja obcinania nie jest niezbędna do stworzenia poprawnego obrazu wynikowego, ale bardzo ważna ze względu na efektywność renderowania. Na scenie znajdować się może bardzo dużo obiektów, jednak przeważnie obserwowany jest tylko fragment sceny, a zatem widoczna jest tylko część obiektów. Dlatego też nie ma potrzeby, aby przeznaczać czas i pamięć na przetwarzanie niewidocznych obiektów. Dalej przetwarzanie odbywa się z pominięciem odrzuconych obiektów. Mapowanie Operacja mapowania przekształca współrzędne znormalizowane do współrzędnych ekranowych. Transformacja polega na przesunięciu środka układu współrzędnych z miejsca położenia kamery do lewego górnego wierzchołka płaszczyzny ekranu. Teksturowanie Obiekty świata rzeczywistego mają często bardzo skomplikowaną fakturę. Zamodelowanie takiego obiektu za pomocą grafiki komputerowej jest niezwykle trudne, a przekształcanie takiego obiektu jest złożone obliczeniowo. W celu wyeliminowania tych trudności stosuje się operację zwaną teksturowaniem. Operacja ta jest kompromisem między efektywnością obliczeń, a jak najwierniejszym odwzorowaniem rzeczywistego obiektu w świecie wirtualnym. Teksturowanie polega na nałożeniu na obiekt sceny 3D obrazu (tekstury) 2D. Zabieg ma na celu oddanie jak największej liczby szczegółów obiektu, nie zwiększając samego skomplikowania modelu. Liczba współrzędnych określających obiekt nie zmienia się w wyniku teksturowania. Proces nakładania tekstury na obiekty nazywa się mapowaniem tekstury (ang. texture mapping). Obiekty trójwymiarowe są przekształcane do odpowiadających im na ekranie obiektów dwuwymiarowych, a na te nakładany jest dwuwymiarowy (również odpowiednio przekształcony) statyczny obraz 2D. Rasteryzacja Rasteryzacja polega na odwzorowaniu w jak najwierniejszy sposób prostej figury geometrycznej (np. punktu, odcinka, trójkąta, wielokąta, okręgu, elipsy) na dyskretnym zbiorze punktów, reprezentujących piksele ekranu. Można powiedzieć, że zadaniem procesu rasteryzacji, wykonywanego podczas renderowania grafiki 3D jest przekształcenie sceny trójwymiarowej na zbiór pikseli, które wyświetlone zostaną na ekranie monitora. Każdy punkt sceny odpowiadać będzie jednemu pikselowi na monitorze w zadanej rozdzielczości. Operacje rasteryzacji wykonuje wyspecjalizowana jednostka (rasteryzator) znajdująca się na karcie graficznej. Z punktu widzenia układu współrzędnych rasteryzacja jest transformacją współrzędnych znormalizowanych (współrzędne mają charakter ciągły) do współrzędnych ekranowych (współrzędne dyskretne) wynikających z rozdzielczości ekranu. Dla prostych figur geometrycznych istnieją bardzo proste i efektywne algorytmy, które we współczesnych kartach graficznych są implementowane sprzętowo. 3. Wsparcie sprzętowe Renderowanie jest procesem bardzo złożonym obliczeniowo. Z tego powodu dzisiejsza grafika komputerowa wykorzystuje wsparcie sprzętowe do tworzenia obrazów i animacji. Procesory graficzne we współczesnych kartach graficznych pozwalają na bardzo efektywne i szybkie renderowanie grafiki trójwymiarowej. Umożliwiają to specjalne podzespoły dedykowane do obliczeń geometrycznych i wyliczania efektów świetlnych. Takie sprzętowe podejście pozwala w znaczący sposób przyspieszyć proces renderowania. Przeniesienie obliczeń z procesora głównego na procesor graficzny pozwala efektywniej przetwarzać aplikacje graficzne. Skoro główna jednostka obliczeniowa komputera nie zajmuje się przetwarzaniem grafiki, to można ją wykorzystać do innych obliczeń, np. związanych z ruchem obiektów na scenie, wykrywaniem kolizji obiektów lub innym zachowaniem się świata wirtualnego. Moc obliczeniowa kart graficznych z roku na rok rośnie. Jednak wydajność pojedynczego procesora graficznego nadal stanowi poważne ograniczenie dla bardziej skomplikowanych scen. Proces renderowania dla: scen zawierających ogromna liczbę obiektów, obiektów o skomplikowanej strukturze, animacji o wysokiej liczbie klatek na sekundę, obrazów o bardzo wysokiej rozdzielczości jest bardzo czasochłonną operacją. Dlatego powstało wiele mechanizmów oraz algorytmów rozproszonego renderowania, które mają na celu w znaczący sposób przyspieszyć proces renderowania grafiki trójwymiarowej. Nieprogramowalne elementy potoku Odpowiadają m.in za: przetwarzanie instrukcji asemblera; składanie figur z wierzchołków; rasteryzacja; zapis do bufora wynikowego obrazu; Z programistycznego punktu widzenia niektóre z tych operacji wykonywane są automatycznie, natomiast możliwa jest ich ograniczona konfiguracja. Rysunek poniższy przedstawia schemat, który zawiera również te niezmienne etapy przetwarzania potokowego. Program/API Program - Jest to program wykonywany przez CPU. To w tym programie zdefiniowana zostaje ‘praca’ do wykonania przez GPU, tj. wygenerowanie wierzchołków i tekstur, które następnie podlegają przetworzeniu przez shakery za pomocą określonego programu. Driver – sterownik W większości przypadków producenci GPU nie ujawniają wszystkich tajemnic związanych z implementacją sterowników; Może stanowić ‘wąskie gardło’ i problemy z kompatybilnością w przypadku błędów lub brakach w implementacjach niektórych funkcji. Input Asembler/Obliczenia wstępne Zadaniem tego niezmiennego elementu potoku jest odbiór danych pochodzących ze sterownika i translację do formy wykorzystywanej przez GPU. Odnosi się to do zadanych przez CPU do przetworzenia figur podstawowych (punkty, linie, trójkąty). Składanie prymitywów Transformacja wierzchołków, będących wynikiem działań Vertex Processor w figury geometryczne, np. punkty, linie, trójkąty Rasteryzacja oraz Interpolacja Przypisanie wartości współrzędnych fragmentów wielokąta w przestrzeni do współrzędnych w buforze/teksturze (rasteryzacja). Następuje również interpolacja wartości w przypadku braku odwzorowania 1:1. Frame Buffet/Bufor Ramki Tutaj budowane i przechowywane są obrazy przeznaczone do wyświetlenia na ekranie w postaci dwuwymiarowej tablicy pikseli. Powyższy schemat przedstawia poszczególne etapy powstawania obrazu, zaczynając od programu wykonywanego przez CPU, gdzie następuje wywołanie tworzące 3 wierzchołki oraz przypisanie do nich współrzędnych tekstury. Reszta operacji wykonywana jest już po stronie GPU. Sterownik (Driver) pełni w tym przypadku rolę pośrednika pomiędzy CPU a GPU. Procesor wierzchołków dokonuje transformacji ich współrzędnych. Program dla procesora geometrii może zwiększyć ilość wierzchołków opisujących figurę, tak aby zamodelować krzywą. Pixel Shader przetwarza każdy piksel tekstury nałożonej na obiekt, w celu ustawienia wartości koloru w zależności od położenia i innych danych. Ostatnim etapem przetwarzania jest umieszczenie obrazu wynikowego w specjalnym buforze (Frame buffer). 4. Przyspieszenie obliczeń - zrównoleglenie obliczeń w procesie renderowania. Celem rozproszenia obliczeń w procesie renderowania jest zrównoleglenie obliczeń, co znacząco przyspiesza cały proces. Istnieje kilka różnych sposobów zrównoleglenia obliczeń w procesie renderowania grafiki trójwymiarowej. Zalicza się do nich: zrównoleglenie funkcjonalności (z ang. functional parallelism), rozproszenie danych (z ang. data parallelism) oraz zrównoleglenie w czasie (z ang. temporal parallelism). W zależności od aplikacji graficznej i celu, jaki realizuje, stosuje się różne metody zrównoleglenia. Wpływ na wybór najefektywniejszej formy zrównoleglenia obliczeń ma wiele czynników, np. rodzaj sceny, oczekiwany wynik renderingu (obraz statyczny lub animacja). W bardziej skomplikowanych problemach renderingu stosuje się metody hybrydowe (z ang. hybrid parallelism) łączące różne podstawowe metody zrównoleglenia. Zrównoleglenie funkcjonalności Jednym ze sposobów zrównoleglenia jest podział całego procesu renderowania na mniejsze zadania. Każde zadanie realizuje pewną funkcjonalność. Przykładem tego typu zrównoleglenia jest potok graficzny. Potok składa się z kilku następujących po sobie zadań. Każde zadanie odpowiada jednemu etapowi. Dane wyjściowe jednego etapu są danymi wejściowymi następnego. Gdy dane zostaną przeliczone przez jedno zadanie (zakończony zostanie jeden z etapów) są przekazywane do następnego. W tym czasie pierwsze zadanie może przeliczyć nową porcję danych. Poziom zrównoleglenia jest wprost proporcjonalny do liczby etapów w potoku. Zrównoleglenie funkcjonalności jest szczególnie efektywne dla danych reprezentujących proste obiekty takie jak: punkty, odcinki, proste figury geometryczne. Zrównoleglenie funkcjonalności stało się na tyle popularną metodą przyspieszania obliczeń graficznych, że współcześnie metoda ta realizowana jest prawie tylko sprzętowo. Nawet najprostsze karty graficzne dysponują możliwością przetwarzania potokowego. Pomimo swoich zalet i tak powszechnego stosowania zrównoleglenia funkcjonalności, metoda ta ma dwie wady. Po pierwsze, szybkość przetwarzania w tym podejściu równa jest najwolniejszemu zadaniu realizowanemu w potoku. Dlatego szybkość przetwarzania wszystkich etapów w potoku powinna być zbliżona. Druga wada to fakt, że stopień zrównoleglenia jest zależny od liczby etapów w potoku, których nie jest wystarczająco wiele (wyróżnia się tylko kilka do kilkunastu etapów przetwarzania potokowego). Rozproszenie danych Celem tego podejścia jest rozproszenie danych i przetwarzania ich równolegle. Obliczenia wykonywane są przez więcej, niż jedną jednostkę renderującą. W porównaniu z metodą zrównoleglenia funkcjonalności rozproszenie danych nie jest ograniczone liczbą etapów. Ograniczenie stanowi połączenie i komunikacja między jednostkami renderującymi. Wiąże się to z dodatkowym narzutem obliczeniowym na zarządzanie procesem renderowania, tak by przebiegał poprawnie. Obraz wynikowy musi być identyczny jak w przypadku sekwencyjnego przetwarzania tych samych danych. Metodę rozproszenia danych implementować można programowo oraz sprzętowo. Na rynku oprogramowania można znaleźć wiele bibliotek udostępniających algorytmy renderingu wykorzystujące metodę rozproszenia danych. Rozproszenie danych między jednostki liczące może odbywać się w dowolnej fazie przetwarzania potokowego. W zależności od miejsca podziału, wyróżnia się dwa sposoby rozproszenia: rozproszenie obiektu i rozproszenie obrazu. W pierwszej metodzie rozproszenie danych odbywa się w pierwszej fazie potoku graficznego, transformacji geometrii. Podejście polega na rozesłaniu do jednostek obliczeniowych danych w postaci prymitywów. Prymityw w grafice komputerowej to pojęcie określające proste figury geometryczne: odcinki, trójkąty, wielokąty. Rozproszenie obrazu odbywa się drugiej fazie przetwarzania potokowego (w fazie rasteryzacji) i polega na podziale między jednostki obliczeniowe pikseli obrazu wynikowego. W praktyce stosuje się równocześnie oba podejścia. Brak zrównoleglenia we wszystkich etapach potoku graficznego jest bardzo nieefektywne (spowolnienie proces renderingu). Zrównoleglenie w czasie W aplikacjach graficznych, których wynikiem jest obraz ruchomy nie jest ważny czas renederowania pojedynczej klatki tylko całej sekwencji kolejnych klatek animacji. W zrównolegleniu w czasie klatki rozdziela się między jednostki renderujące. Każda jednostka otrzymuje do wyrenderowania określoną liczbę klatek, które są następnie w odpowiedniej kolejności prezentowane. Metody hybrydowe Metody hybrydowe zrównoleglenia procesu renderingu polegają na łączeniu metod opisanych powyżej. Przykładem podejścia hybrydowego jest współczesna karta graficzna, która łączy dwie metody: zrównoleglenie funkcjonalności oraz rozproszenie danych, przetwarzając dane w kilku potokach naraz. Inne rozwiązania to różnego rodzaju zrównoleglenia realizowane programowo lub programowo-sprzętowo.