Blaski i cienie DirectX 10

Już wkrótce na rynku pojawią się pierwsze gry wykorzystujące możliwości najnowszych bibliotek graficznych Microsoftu - DirectX 10. Przyjrzyjmy się bliżej, co zawiera ten najnowszy graficzny API.


Już wkrótce na rynku pojawią się pierwsze gry wykorzystujące możliwości najnowszych bibliotek graficznych Microsoftu - DirectX 10. Przyjrzyjmy się bliżej, co zawiera ten najnowszy graficzny API.

Blaski i cienie DirectX 10

Do tego programu demonstracyjnego Adrianne, promującego karty graficzne z serii GeForce 8800, swojego wizerunku użyczyła znana amerykańska modelka Adrienne Curry. Efekt pracy akceleratora 3D jest zdumiewający, zwłaszcza gdy porównamy zdjęcia modelki z jej wirtualną postacią.

Biblioteki graficzne, takie jak DirectX i nieco mniej obecnie popularny OpenGL, to specjalny rodzaj interfejsu programistycznego API (Application Programming Interface), pośredniczącego w komunikacji między aplikacją (np. grą) a kartą graficzną zainstalowaną w komputerze. Biblioteki graficzne DirectX i OpenGL mają zunifikować polecenia i procedury dotyczące wszystkich aspektów tworzenia trójwymiarowej grafiki między innymi po to, aby programista nie musiał pisać kilku wersji swojego programu do różnych akceleratorów 3D - np. trzech wydań gry do kart graficznych ATI, NVIDII czy firmy S3. Wystarczy, że korzystający z bibliotek programista posłuży się poleceniami i formatami danych dopuszczonymi przez interfejs API, a wynik na ekranie będzie zawsze ten sam - niezależnie od typu akceleratora 3D w pececie.

Blaski i cienie DirectX 10

Ewolucja modeli cieniowania

Po drugiej stronie bibliotek graficznych znajduje się sterownik karty 3D. Do jego zadań należy tłumaczenie ciągu instrukcji i danych płynących z interfejsu API na kod zrozumiały dla urządzenia. Sterownik do karty graficznej musi dostarczyć producent, gdyż tylko on zna poszczególne funkcje graficzne i sposoby przetwarzania potoku graficznego realizowanego bezpośrednio przez układ 3D. Oczywiście, im sterownik ma mniej do roboty, tym lepiej, gdyż operacje graficzne będą wykonywane szybciej. Z tego powodu producenci układów 3D starają się, żeby ich układy były jak najbardziej zgodne z bibliotekami graficznymi, i inżynierowie, niezależnie od tego, czy ich firmy ze sobą konkurują, czy nie, bardzo ściśle współpracują z programistami piszącymi API. Takie wspólne zespoły specjalistów decydują również, czy do kolejnej wersji bibliotek graficznych należy wprowadzić nowe efekty i jak powinny być - mniej więcej - realizowane sprzętowo. "Mniej więcej", gdyż szczegółowa droga do tego, aby na ekranie uzyskać odpowiedni efekt graficzny, zależy wyłącznie od firmy projektującej układ 3D i funkcji zaimplementowanych w jego strukturze. Z tego powodu, mimo unifikacji wprowadzonej przez biblioteki graficzne, obraz wygenerowany przez różne modele układu 3D, nawet tego samego producenta, może wyglądać nieco inaczej. Część funkcji obsługiwanych przez biblioteki może też nie zostać zaimplementowana, gdyż do osiągnięcia zgodności z daną wersją bibliotek graficznych wystarczy, że karta wykonuje wszystkie podstawowe instrukcje przewidziane w specyfikacji.

Postęp zależy od DirectX

Blaski i cienie DirectX 10

W DirectX 10 do tradycyjnego modelu przetwarzania grafiki, wykorzystującego moduły Vertex i Pixel Shader, dodano jednostki Geometry Shader. Do ich zadań należy m.in. przetwarzanie i deformacja elementów szkieletu sceny, które połączono w większą całość. Dotychczas tymi obliczeniami zajmowała się jednostka centralna komputera. .Źródło: ATI

Jak wspomnieliśmy najpopularniejsza wśród twórców gier biblioteka graficzna to opracowany przez Microsoft DirectX. Znacznie mniej firm stosuje konkurencyjny OpenGL (najbardziej znana to id Software, twórca legendarnego "Quake'a" i "Dooma"). Pierwsza wersja bibliotek DirectX ukazała się w 1995 roku, w którym zadebiutował Windows 95. Przełomowe okazały się jednak dopiero wersje 6.1 i 7.0 (obie pojawiły się w 1999 roku), w których wprowadzono kolejne elementy klasycznego już dzisiaj modelu generowania grafiki, polegającego na obsłudze potoków renderujących i sprzętowego wspomagania operacji geometrycznych i kalkulacji oświetlenia T&L (Transform and Lighting). Od momentu powstania DirectX 6.1 i 7.0 i zgodnych z nimi kart możemy mówić o akceleratorach, które przejęły na siebie część zadań związanych z generowaniem grafiki 3D, ujednolicając ten proces i jednocześnie odciążając procesor komputera od zadań związanych z tworzeniem trójwymiarowych obrazów.

Kolejna wersja bibliotek DirectX 8.0 z 2000 roku wprowadziła model przetwarzania grafiki oparty na cieniowaniu. W akceleratorach 3D zgodnych z tymi bibliotekami pojawiły się programowalne jednostki Vertex i Pixel Shader, które mogą zmodyfikować szkielet sceny, tekstury i pojedyncze piksele w trakcie ich przetwarzania w potoku graficznym lub nawet na gotowej scenie 3D. Przekształcenia te zależą od fantazji i umiejętności programisty, który aby je przeprowadzić, musi się posłużyć krótkimi programami, tzw. shaderowymi. Za ich pomocą można np. stworzyć własne, nieosiągalne w inny sposób efekty graficzne. Oczywiście cały czas programiści mogą korzystać z funkcji zaszytych w DirectX, a kolejne wersje bibliotek są kompatybilne wstecz ze starym API.

Dopiero od chwili pojawienia się bibliotek DirectX 8.0 można mówić o przejęciu wszystkich funkcji strumienia graficznego przez kartę, a układ graficzny nazywać graficznym procesorem GPU (Graphics Processing Unit). Następne wersje DirectX (8.1, 9.0, 9.0a, 9.0b i 9.0c) wprowadzały kolejne ulepszenia do architektury cieniowania i implementowały nowe funkcje 3D do bibliotek graficznych Microsoftu. Na następną dużą zmianę przyszło nam poczekać nieco ponad dwa lata, do 30 listopada 2006 roku, kiedy to oficjalnie zaprezentowano biblioteki DirectX 10.

Napisane na nowo

Blaski i cienie DirectX 10

W DirectX 9 na generowanej scenie 3D można było umieścić najwyżej 500 obiektów. W DirectX 10 nie ma już tego ograniczenia i programiści mogą tworzyć niezwykle realistyczne sceny w grach. Na ilustracji zapowiadany na trzeci kwartał tego roku "World in Conflict" firmy Sierra Entertainment.

Biblioteki graficzne Microsoft DirectX 10 znane były do niedawna pod trzema równolegle używanymi nazwami: oryginalną Windows Graphics Foundation, DirectX 10 oraz DirectX Next. Zwyciężyła druga, której z przyzwyczajenia większość osób używała najczęściej. Nowy interfejs API dostępny jest tylko z systemem operacyjnym Windows Vista. W związku z tą integracją Microsoft nie planuje, przynajmniej tak wynika z oficjalnych informacji, opracowania wersji DirectX 10 do Windows XP.

Co więcej, DirectX 10 różni się na tyle od poprzedników, że nie zachowano w nim kompatybilności z poprzednimi bibliotekami graficznymi, jeśli chodzi o obsługę sprzętu. Dlatego w Vistę wbudowano DirectX 9.0L, który współpracuje z kartami poprzedniej generacji. DirectX 9.0L i DirectX 10 nie mają wspólnych elementów i należy je traktować jako dwa odrębne interfejsy API - pierwszy do obsługi starszych kart, a drugi jako współpracujący z akceleratorami 3D najnowszej generacji.

Jak można się domyślić, DirectX 10 napisano od nowa, dlatego uniknięto w nim wielu błędów i ograniczeń poprzednich wersji interfejsu. Twórcy kart, zarówno NVIDIA, jak i ATI, podkreślają przede wszystkim istotne zmniejszenie narzutu interfejsu API na tworzenie grafiki (API overhead). Oczywiście, biblioteka graficzna wymaga pewnej mocy obliczeniowej procesora. Dotąd zajmowała ok. 40 procent cykli procesora przeznaczonych na tworzenie grafiki, a w DX10 ok. 20 procent.

Blaski i cienie DirectX 10

Architektura zunifikowanych modułów graficznych w DirectX pozwala uniknąć opóźnień spowodowanych tym, że jednostki Vertex Shader albo Pixel Shader mają puste cykle do chwili, gdy bardziej obciążona grupa shaderów przekaże im dane do dalszych obliczeń. Źródło: NVIDIA

W dotychczasowym API obowiązywał limit liczby obiektów wyświetlanych jednocześnie w scenie 3D (do pięciuset), operacji wykonywanych na obrazie, takich jak zamiana tekstur, formatu danych dla jednostek Vertex i Pixel Shader i trybów mieszanych. Z ograniczeniem liczby obiektów twórcy radzą sobie, kopiując je, np. tworząc las z kilku modeli drzew. Rezultat jest znacznie mniej realistyczny, niż mógłby być, gdyby nie ograniczenia wynikające z interfejsu. Nie narzuca ich DX10, który pozwala tworzyć znacznie bardziej realistyczne gry, z pokaźną liczbą obiektów wyświetlanych na ekranie, oczywiście jeśli pozwoli na to wydajność samej karty.

Na jakość programowania i szybkość generowania grafiki wpływają też nowe procedury sprzętowe. Ponieważ usunięto ograniczenia związane ze wsteczną kompatybilnością, wystarczy raz odwołać się do procedur sprzętowych, aby biblioteki wiedziały, jakie instrukcje oraz formaty danych są dozwolone, i gra mogła zająć się jej generowaniem. W DirectX 9.0c takie czasochłonne sprawdzanie odbywa się wiele razy podczas tworzenia sceny 3D. Zoptymalizowano również algorytmy zarządzania tablicami tekstur, rysowania z wyprzedzeniem (predicated draw) i wysyłania strumienia danych. Teraz wymagają one znacznie mniej interwencji jednostki centralnej. Notabene właśnie w DirectX 10 wprowadzono tablice tekstur (texture arrays), mieszczące do 512 pojedynczych tekstur, i mechanizm strumienia danych (stream out), pozwalający wysłać w dowolnej chwili rezultaty pracy jednostek przetwarzania geometrii wprost do pamięci karty.