TechnologieMoc obrazu

    Moc obrazu

    Grafika w grach jest coraz ładniejsza i coraz bardziej realistyczna. To za sprawą silnika danej gry oraz wydajnych kart graficznych. Pokażemy, w jaki sposób generują one grafikę z gier i z jakim ogromem obliczeń muszą sobie radzić.

    Moc obrazu

    Silnik gry jest kodem opisującym tworzenie i wyświetlanie grafiki. Wykorzystuje on zarówno efekty zdefiniowane w bibliotekach graficznych (OpenGL czy DirectX), jak i autorskie rozwiązania. To m.in. na podstawie tego kodu karta graficzna generuje i przetwarza obraz z gry, a następnie wysyła go na ekran. Silnik graficzny zawiera również opis interakcji zachodzących w wirtualnym świecie (tzw. fizykę gry), których realizacja coraz częściej należy do karty graficznej.

    Podstawą procesu generowania grafiki przez współczesne karty są skomplikowane obliczenia wykonywane przez procesor graficzny (GPU). Proces generowania pojedynczej klatki obrazu, aby gra zachowała dynamikę i płynność, musi się powtórzyć co najmniej 30 razy w ciągu każdej sekundy!

    1. Informacje o scenie

    Na samym początku procesu tworzenia obrazu procesor centralny komputera przesyła do pamięci karty graficznej podstawowe informacje o tworzonej scenie gry. Na taki pakiet składają się wszystkie tekstury, współrzędne wierzchołków elementów sceny, a także dodatkowe informacje określające ich położenie względem siebie, umiejscowienie obserwatora oraz oświetlenia całej sceny. Oprócz tego procesor główny przesyła na bieżąco do karty instrukcje z kodu gry oraz koordynaty dotyczące zmiany położenia myszki lub naciskanych przycisków klawiatury.

    2. Operowanie wierzchołkami

    Na podstawie uzyskanych współrzędnych wierzchołków (1) karta graficzna buduje krawędzie trójkątów (2), z których powstają siatki obiektów. Posłużą one do zdefiniowania powierzchni wirtualnych obiektów.
    Procesor graficzny ustawia na wirtualnej scenie kamerę, czyli punkt, z którego wirtualny świat będzie obserwowany. Następnie siatki obiektów oraz otoczenia są umieszczane na scenie w odpowiednich pozycjach względem kamery lub obserwatora (3). Kamera czy obserwator jest elementem nieruchomym. Aby uzyskać wrażenie, że porusza się i obraca, należy poruszać, obracać i przekształcać siatki elementów sceny względem nieruchomego obserwatora (4). Operacje te są na bieżąco synchronizowane z pozycją myszki czy z instrukcjami wydawanymi przez użytkownika na klawiaturze.

    Procesor graficzny ustawia także wszystkie źródła światła. Oświetlenie sceny posłuży jednostkom obliczeniowym do określenia sposobu cieniowania elementarnych płaszczyzn obiektów przestrzennych, a na późniejszym etapie – do uzyskania odpowiednich cieni w grafice.

    Obraz
    Obraz

    3. Usuwanie trójkątów

    Aby zminimalizować liczbę operacji przeprowadzanych przez kartę graficzną, usuwane są z siatek trójkątów te niewidoczne dla obserwatora. Wycinane są wszystkie elementy znajdujące się za jego plecami – zielony obszar na ilustracji (5), oraz wszystkie poza kadrem obserwatora – czerwony obszar na ilustracji (5). Procesor w obliczeniach nie uwzględnia tych ścianek obiektów, które są zasłonięte przez inne przedmioty na scenie (6). Wyjątek to sytuacja, gdy obiekt zasłaniający będzie pokryty przezroczystym materiałem. W procesie obliczeniowym nie są też uwzględniane elementy znajdujące się z tyłu obserwowanych obiektów.

    Obraz

    4. Ustalanie gęstości siatek

    Jednostki obliczeniowe procesora graficznego sprawdzają, które z wierzchołków sceny znajdują się bliżej gracza, a które dalej. Na tej podstawie określają grupy siatek, w których liczba trójkątów zostanie powiększona (wirtualne obiekty znajdujące się blisko postaci gracza musi cechować duży realizm) lub zmniejszona (elementy znajdujące się daleko od gracza są słabo dostrzegalne, zatem nie muszą być szczegółowe). Zabieg ten pozwala zwiększyć realizm sceny, a jednocześnie optymalizuje liczbę szczegółów na scenie, co oznacza mniej obliczeń do wykonania przez kartę (7). Uzyskane dane przekazywane są do modułów teselacji.

    Obraz

    5. Zagęszczanie siatek

    Do wykonania operacji teselacji (zagęszczania) siatek przeznaczono aż trzy nowe funkcje cieniujące (Hull Shader, Domain Shader i Geometry Shader), które są realizowane przez rdzenie obliczeniowe procesora graficznego. Funkcje te (shadery) wchodzą w skład bibliotek graficznych DirectX 11. W procesie teselacji biorą też udział sprzętowe jednostki teselacji, znajdujące się we współczesnych procesorach graficznych.

    Hull Shader zajmuje się transformacjami rodzajów siatek obiektów na inne. Może zamieniać klasyczną siatkę geometryczną (8) w strukturę zawierającą tzw. powierzchnie sklejane Beziera. Zmniejsza to liczbę operacji związanych z obiektami. Powierzchnie Beziera potrzebują do obliczeń zaledwie kilku lub kilkunastu punktów kontrolnych dla pojedynczego obiektu. Natomiast przy klasycznych siatkach geometrycznych obliczeniom podlegają wszystkie wierzchołki siatki. Pomimo mniejszej liczby punktów kontrolnych uzyskiwana jest niezwykle gładka powierzchnia obiektu bez względu na jego przybliżenie do kamery (9).

    Obiekt powstały z powierzchni Beziera jest przesyłany do teselatora. Ten dzieli go na siatkę geometryczną składającą się z odpowiednio większej liczby trójkątów.Domain Shader pobiera następnie dane z tekstur (10) zawierających opis wysokości dla każdego piksela. Na ich podstawie przypisuje wartość wysokości każdemu wierzchołkowi w siatce otrzymanej z Hull Shadera i teselatora.

    Te informacje pozwolą określić, jak mają być poprzesuwane wierzchołki obiektu, by na jego powierzchni można było uzyskać dodatkowe detale geometryczne. Dzięki temu bryła wygląda bardziej naturalnie bez potrzeby umieszczania tych detali w podstawowym opisie siatki obiektu. Odciąża to znacznie programistów i grafików, ponieważ to zadanie przejmuje układ GPU. Dzięki tym funkcjom procesor graficzny sam potrafi na bazie tekstur uzyskać odpowiednio złożoną siatkę.

    Geometry Shader to jednostka wykonawcza, która transformuje siatkę na bazie otrzymanych z Hull Shadera parametrów. On też tworzy dodatkowe wierzchołki, krawędzie oraz trójkąty, tak by obiekt wyjściowy wyglądał realniej. Pozwala to na łatwe uzyskanie np. nierówności w murach (11), bardzo realistycznie wyglądających gór (np. dzięki zastosowaniu map fraktalnych) lub efektu falującego morza (w wyniku nakładania animowanej mapy przemieszczeń). Te dodatkowe detale są już uwzględniane na następnych etapach procesu tworzenia grafiki, takich jak np. rzucanie cieni czy tworzenie odbić z otoczenia.

    Obraz
    Obraz

    6. Rasteryzacja, czyli nadawanie obiektom kolorów i tekstur

    Utworzony obraz zostanie teraz przystosowany do wyświetlania na płaskiej powierzchni ekranu. W tym celu wszystkie siatki obiektów są wypełniane jednolitym kolorem z uwzględnieniem oświetlenia sceny (12). Przy użyciu modułu rasteryzacji grafika jest spłaszczana i przygotowywana do wyświetlania w rozdzielczości ekranu (13). W międzyczasie część jednostek obliczeniowych GPU zajmuje się dalszą obróbką grafiki: nadaje obiektom różne kolory, połysk, fakturę i inne detale. W późniejszym etapie moduł rasteryzacji zajmie się wygładzaniem krawędzi w spłaszczonych obiektach (14). Można to robić na co najmniej kilkanaście sposobów, które różnią się stopniem obciążenia procesora graficznego.

    Obraz

    7. Operacje na teksturach

    Szlifowaniem grafiki, tak by zyskała na realizmie, zajmują się te same co porzednio jednostki obliczeniowe procesora graficznego. Podstawowym celem ich pracy jest nadanie obiektom cech materiałów, z jakich są zbudowane. Cechy te są przekazywane przez tekstury, np. zdjęcia realnych obiektów. Na każdy obiekt przypada co najmniej kilka tekstur (15). Dodatkowo nakładane tekstury są poddawane filtrowaniu, które uwzględnia zniekształcenia wprowadzane przez geometrię. Pozwala to jeszcze wierniej oddać na ilustracji rzeczywistość (16).

    Aby dwuwymiarowe tekstury zostały nałożone na trójwymiarowy obiekt przestrzenny, jest on „rozklejany” i rozkładany na płasko. Do tak uzyskanej siatki „docinana” jest płaska tekstura i potem zakładana na obiekt przestrzenny.

    Na tym etapie do obrazu dodawane są różne efekty. Przykładowo do wygenerowania trawy nakłada się na jedną sekcję wielokątów mapę przezroczystości oraz teksturę samej trawy (18). W podobny sposób powstają inne efekty, jak np. liście na drzewach czy elementy maskowania wojskowego.

    Na podstawie danych o oświetleniu sceny, zdefiniowanych w początkowym etapie generowania grafiki, jednostki obliczeniowe tworzą realistyczne cienie rzucane przez oświetlone obiekty. Mają do dyspozycji co najmniej kilka funkcji tworzenia cieni. Te, które wyglądają szczególnie realistycznie, wymagają jednak większej mocy obliczeniowej i spowalniają proces tworzenia grafiki.

    Jednostki obliczeniowe generują też takie zjawiska, jak mgły, ognie i wybuchy czy dymy. Tworzą odbicia (również te dynamiczne) w obiektach o wysokiej połyskliwości. Aby uzyskać ten efekt, tworzona jest tekstura będąca odzwierciedleniem środowiska, w którym dany obiekt się znajduje, a potem nakładana jest na obiekt graficzny. Podobnie uzyskiwane są odbicia w wodzie.

    Obraz

    8. Generowanie dodatkowych efektów w tworzonej scenie

    Uzyskanie dodatkowych efektów zależy też od programistów, gdyż oprócz stosowania efektów dostępnych w bibliotekach graficznych mogą tworzyć własne rozwiązania. Jest to możliwe, bo jednostki obliczeniowe generujące efekty są programowalne.

    Chętnie stosowane są tekstury nieba o wysokiej rozpiętości tonalnej (HDR), dające efekt oświetlenia jeszcze bardziej zbliżonego do rzeczywistego. Jednostki obliczeniowe generują też efekt rozpraszania podpowierzchniowego, w którym światło przenika przez cienkie fragmenty ciała.

    Jednostki obliczeniowe zajmują się też takimi efektami, jak np. widoczne promienie słoneczne czy poświata na części obiektów 3D sceny (21). Poza tym to do nich należy kompozycja i postprodukcja sceny – dodawanie takich efektów, jak np. odbicie promieni słonecznych w soczewce czy uzyskanie głębi ostrości. Teraz wystarczy nałożyć na grafikę mapę przezroczystości (20) oraz szablon (19), zawierający np. celownik graficzny i informacje o statusie gracza. Jedna klatka jest gotowa.

    Obraz

    Wybrane dla Ciebie