Zabawa matką postępu
Od czasu powstania pierwszych gier wykorzystujących środowisko 3D, jesteśmy świadkami niezwykle prężnego rozwoju komputerów. Niewielu bowiem zaprzeczy, że to właśnie gry są jednym z głównych, jeśli nie najważniejszym, motorem postępu w grafice komputerowej oraz sprzęcie w ogóle. Kolejne tytuły z rosnącą ilością efektów specjalnych oraz komplikacją tworzonych scen 3D, stawiają naszym PC coraz wyższe wymagania. W przeszłości karty graficzne posiadały tylko kilka zaszytych sprzętowo algorytmów, mogących posłużyć do przetwarzania danych o geometrii i teksturach renderowanej sceny. W 2001 roku pojawiły się pierwsze akceleratory mające możliwość programowej obsługi tytułowych Shaderów, dając twórcom gier nowe narzędzie do pracy i pole do popisu. Najprościej mówiąc Shader to mini program służący w grafice 3D do cieniowania, określania ostatecznej powierzchni obiektu lub obrazu. Zanim jednak powiemy o nim więcej – parę słów o podstawach tworzenia obiektów w grafice trójwymiarowej.
Od wierzchołków do tekstury
Model 3D składa się z jednej lub więcej siatek zbudowanych z wierzchołków, czyli punktów w trójwymiarowej przestrzeni. Wierzchołki modeli połączone są w trójkąty, najprostsze płaskie figury geometryczne. Z połączenia trójkątów otrzymujemy natomiast siatkę modelu trójwymiarowego. W aplikacjach czasu rzeczywistego bardzo rzadko używa się innych prymitywów niż trójkąty, ponieważ ich renderowanie jest zdecydowanie najszybsze. Siatka modelu reprezentuje jego kształt w przestrzeni, a za wygląd odpowiedzialny jest materiał pokrywający obiekt. Materiał jest zestawem parametrów opisujących powierzchnię renderowanej siatki, a także sposób jej renderowania, czyli to, jakiego koloru będzie siatka modelu lub jaką teksturą zostanie on pokryty.
Shader – narzędzie co najmniej dobre
Jak już wspomnieliśmy wcześniej Shader to mini program. Jest on pisany zwykle w specjalnym języku (shading language) i wykonywany w podzespołach akceleratora graficznego, odpowiedzialnych za jego realizację – Pixel Shaderach (jednostka cieniowania pikseli) i Vertex Shaderach (jednostka cieniowania werteksów). Shadery pozwalają programiście na użycie, podczas tworzenia scen 3D, szerokiej gamy efektów jak pochłanianie światła, refrakcja, dyfuzja, odbicia lustrzane, rozmycie obrazu i wiele innych. Wszystkie operacje wykonywane są w wyżej wymienionych Pixel i Vertex Shaderach w czasie rzeczywistym i jednocześnie. To pozwala na dużo bardziej skomplikowane modelowanie oświetlenia i tekstury oraz uniezależnienie się od T&L, dzięki czemu oprócz poprawy jakości wyświetlanego obrazu wzrasta szybkość generowania klatek animacji. Pojawienie się Shaderów przyniosło także sprzętową obsługę LOD (poziom uszczegółowienia grafiki), który do tej pory był implementowany programowo, co poważnie spowalniało silniki gier 3D.
Odrobina historii, czyli nVidia vs ATI
Era sprzętowego cieniowania nastała wraz z pojawieniem się bibliotek DirectX 8.0 i wprowadzonych w nich operacjach na potokach, z których korzystały Shadery. Pierwszymi kartami graficznymi posiadającymi Pixel i Vertex Shadery były GeForce3 oraz ATI Radeon 8500. Początkowo akceleratory graficzne posiadały zaledwie kilka Shaderów, a ich poprawną obsługę zapewniał zestaw funkcji Shader Model 1.0. DirectX 9.0b przyniósł ze sobą specyfikację SM 2.0 obsługiwaną przez karty ATI, oparte na silniku graficznym Smatrshader HD. Odpowiedzią nVidii była rodzina akceleratorów GeForce 6xxx, zgodna z DirectX 9.0c oraz SM 3.0 (silnik graficzny Cine FX 3.0). O ile różnica pomiędzy SM 1.0 a 2.0 i skok w jakości grafiki 3D był bezdyskusyjny, to w przypadku porównania Smartshader HD z Cine FX 3.0 tak różowo już nie było. Na papierze specyfikacja Shader Model 3.0 prezentowała się znacznie lepiej od swojego poprzednika, co zrozumiałe, gdyż była technologią nowszą, natomiast w praktyce bywało różnie. Pierwsze tytuły gier obsługujące SM 3.0 wcale nie rzucały nas na kolana, tak jak zapowiadali producenci, a na forach dyskusyjnych niejednokrotnie zwolennicy ATI udowadniali, że na ich „Radkach” z SM 2.0 grafika nie wygląda gorzej, a czasami nawet i lepiej. Ponadto ATI zarzuciła nVidii, iż nie wszystkie jej karty w pełni i poprawnie obsługują nową specyfikacje. Przyprawiło to pewnie o ból głowy niejedną osobę noszącą się z zamiarem kupna nowego akceleratora graficznego. Sytuacja ta spowodowana była w naszej opinii lenistwem programistów i chęcią producentów gier do jak najszybszego wydania nowego tytułu ze znaczkiem SM 3.0, którzy dostając nowe narzędzie do ręki, wykorzystywali je tylko w niewielkiej części. Ale to już temat na oddzielny artykuł.
Na dziś – SM 3.0, na jutro – cień Visty
Aktualnie Shader Model 3.0 obsługują wspomniane GF6xxx i GF7xxx oraz rodzina kart Radeon X1xxx. Warto zwrócić uwagę na fakt, iż najnowsze układy nVidii i ATI posiadają już kilkakrotnie więcej jednostek cieniowania – GF7900GTX zaopatrzony jest w 24 Pixel Shadery i 8 Vertex Shaderów, natomiast Radeon X1900XTX w odpowiednio 48 i 8. Obrazuje to dobrze jak szybko ewoluowała ta technologia, i jak ważne stały się Shadery dla najnowszych gier. Producentów akceleratorów graficznych, przynajmniej częściowo, powinno pogodzić ukazanie się DirectX 10 wraz z SM 4.0, o czym pisaliśmy w poprzednim artykule. Microsoft zapowiada, iż będzie to milowy krok w rozwoju grafiki, szkoda tylko, że dostępny jedynie dla użytkowników Visty. DX 10 na WindowsXP ponoć nie uświadczymy ...
Słowniczek
Pixel Shader (jednostka cieniowania pikseli) – pozwala na szybkie obliczanie kolorów każdego piksela renderowanego obrazu. Uzyskana barwa jest składową wyników obliczeń Vertex Shadera, analizy parametrów tekstury oraz funkcji opisującej efekt specjalny jak mgła, przezroczystość czy stopień odbicia światła.
Vertex Shader (jednostka cieniowania werteksów) - służy do wykonywania przekształceń geometrycznych renderowanego obrazu na podstawie informacji opisujących werteksy.
Werteks - wierzchołek trójkąta. Z trójkątów składają się renderowane obiekty budujące scenę 3D.
Transform & Lighting – T&L to operacje przetwarzania położenia, kształtu i oświetlenia przedmiotów, z których składa się obraz w grafice trójwymiarowej. Zwykle wykonywane są przez procesor komputera.
LOD (level of detail) – poziom uszczegółowienia grafiki, polegający na wewnętrznym podziale wielokątów z zadaną dokładnością. Podział ten jest nieliniowy, czyli zależny od odległości obserwatora od obiektu – im bliżej tym większy, im dalej tym mniejszy.
Biblioteka – zbiór procedur i danych, z których korzystają różne programy.