DirectX Jacek Filipek IUz gr. 21
Czym jest DirectX ? DirectX to zestaw funkcji API wspomagających generowanie grafiki (2D i 3D), dźwięku oraz innych zadań związanych zwykle z grami i innymi aplikacjami multimedialnymi. Najczęściej wykorzystywany do obsługi grafiki w grach komputerowych. Używany również do pisania programów do specyficznych zadań z wykorzystaniem np. grafiki trójwymiarowej (np. symulacja komputerowa itp.). DirectX jest produktem firmy Microsoft, dostępny tylko na platformę Windows oraz konsolę Xbox.
Czym jest DirectX ? 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.
Czym jest DirectX ? Tak wiec z jednej strony bibliotek graficznych mamy aplikację, z drugiej zaś sterownik karty. Do zadań drivera należy między innymi tłumaczenie ciągu instrukcji i danych płynących z interfejsu API na wewnętrzny język poleceń zrozumiały dla układu graficznego 3D. Wynika z tego, że sterownik karty graficznej powinien być dostarczony bezpośrednio przez producenta układu graficznego, gdyż tylko on najlepiej zna poszczególne funkcje układu i dokładnie wie, jak realizowane jest przetwarzanie potoku graficznego (ciągu następujących po sobie zdarzeń prowadzących do wygenerowania sceny 3D) wewnątrz GPU.
Schemat działania modułu Direct3D 10 z bibliotek DirectX 10 w systemie Vista; źródło: Microsoft
Czym jest DirectX ? Dobrze zaprojektowany tandem: układ 3D–sterownik powinien działać tak szybko, jak to tylko możliwe. Co to oznacza w praktyce? Otóż driver powinien mieć jak najmniej do roboty, aby niepotrzebnie nie obciążać jednostki centralnej komputera. Źle napisany sterownik potrafi spowolnić pracę karty nawet o 30–40%! Z drugiej strony, aby driver działał sprawnie, powinien również jak najmniej ingerować w kod i dane przesyłane z interfejsu API. Aby spełnić ten warunek, inżynierowie projektujący układy 3D dążą do tego, aby ich procesory graficzne były jak najbardziej zgodne z graficznymi bibliotekami. Dzięki temu sterownik karty 3D nie będzie miał dużo do roboty (czyli nie będzie mocno obciążał CPU) przy przekształcaniu ciągu instrukcji na kod zrozumiały dla procesora 3D i przy formatowaniu danych dla niego.
Czym jest DirectX ? Co ciekawe, zespoły projektantów z różnych konkurujących ze sobą firm bardzo ściśle współpracują nie tylko z programistami piszącymi graficzne API, ale również wymieniają się ze sobą szczegółowymi informacjami technicznymi. To od nich w dużej mierze zależy, jakie efekty graficzne wprowadzone zostaną w kolejnej odsłonie bibliotek graficznych i jak w pewnym przybliżeniu powinny być one realizowane na drodze sprzętowej. To przybliżenie drogi realizacji efektu 3D wynika stąd, że dokładna metoda jak dojść do tego, aby na ekranie uzyskać odpowiedni efekt graficzny zależy już wyłącznie od architektury układu i wewnętrznych funkcji zaimplementowanych w strukturze chipa – a takimi informacjami firmy niezbyt chętnie się już dzielą, tym bardziej, że z punktu widzenia projektowania graficznego API to, jak jest wewnętrznie realizowany efekt 3D, nie ma najmniejszego znaczenia.
Czym jest DirectX ? To właśnie różnice w sposobie realizacji efektów 3D, mimo unifikacji wprowadzonej przez biblioteki graficzne, sprawiają, że obraz wygenerowany za pomocą różnych modeli kości 3D (nawet jeśli są one wyprodukowane przez tę samą firmę) może wyglądać nieco inaczej. Na szczęście odstępstwa te nie są zbyt duże i trudno je w praktyce dostrzec, tym bardziej, że projektanci wiedząc jak ma wyglądać dany efekt, dążą do tego, aby to co zobaczymy na ekranie, jak najbardziej zbliżone było do założonego wzorca. Co ciekawe, do tego aby karta 3D zgodna była z jakąś wersją bibliotek graficznych, wcale nie musi wykonywać wszystkich przewidzianych w specyfikacji instrukcji, ani obsługiwać wszystkich formatów danych.
Czym jest DirectX ? D osiągnięcia zgodności wystarczy obsługa podstawowych, wyszczególnionych w specyfikacji API funkcji oraz formatów danych. Bardziej zaawansowane instrukcje mogą być realizowane albo za pośrednictwem symulacji przeprowadzanych w sterownikach (tak realizuje się w niektórych układach zintegrowanych operacje werteksowe, np. w module Intel Graphics Media Accelerator 900 znajdującym się m.in. w chipsetach z serii i915 czy starszym Intel Extreme Graphics 2 z układów i865G) albo zastępowane są innymi operacjami, z którymi radzi już sobie dany model kości 3D. Niestety, w takich wypadkach końcowy obraz nie zawsze wygląda już tak dobrze, jak powinien.
Komponenty DirectX DirectX składa się z szeregu komponentów odpowiedzialnych za realizację poszczególnych funkcji aplikacji, a są to: DirectX Graphics, składające się z dwóch pod-komponentów: DirectDraw - obsługuje grafikę rastrową (bitmapową), Direct3D (D3D) - obsługuje grafikę 3D, DirectInput - przetwarza dane pochodzące z klawiatury, myszy, joysticka lub innych kontrolerów. DirectPlay - wykorzystywany w grach sieciowych, DirectSound - służy do odtwarzania i nagrywania dźwięku, DirectMusic - odtwarza muzykę stworzoną przy użyciu programu DirectMusic Producer, DirectShow - służy do odtwarzania plików audio i wideo, DirectSetup - obsługuje instalację poszczególnych komponentów DirectX DirectX Media Objects - spełnia podobne zadania, jak DirectShow.
Historia DirectX Pierwsza bibliotek DirectX wersja zadebiutowała w sierpniu 1995 roku wraz z premierą systemu Windows 95. DX 1.0 porządkowała sposób wyświetlania grafiki w ówczesnych zaawansowanych programach graficznych takich jak np. AutoCAD i wprowadzał możliwość pisania gier dla systemu Windows, (ówczesne gry korzystały przede wszystkim z DOS-u i własnych procedur tworzenia grafiki). Przełomowe okazały się dopiero biblioteki DirectX w wersjach 6.1 i 7.0. Obie zadebiutowały w 1999 roku – pierwsza w lutym, a druga we wrześniu.
Historia DirectX Dlaczego okazały się one przełomowe? Otóż wprowadzono w nich najważniejsze elementy klasycznego już dzisiaj modelu generowania trójwymiarowej grafiki, a mianowicie obsługę potoków renderujących oraz sprzętowe wspomaganie operacji geometrycznych i kalkulacji oświetlenia T&L (Transform and Lighting). Od momentu premiery bibliotek DX 6.1 i DX 7.0, i przede wszystkim zgodnych z nimi kart graficznych, można już mówić o akceleratorach 3D . Karty takie przejęły bowiem główne elementy procesu generowania grafiki 3D, odciążając jednocześnie procesor (CPU) od zadań związanych z tworzeniem trójwymiarowych scen.
Historia DirectX Wraz z pojawieniem się obsługi T&L w DirectX 7.0 i premierą układu NVIDIA GeForce 256 ze sprzętowym wsparciem dla T&L, NVIDIA ukuła termin GPU – Graphics Processing Unit (analogicznie do akronimu określającego procesor - CPU, Central Processing Unit). Nazwa GPU dla układów graficznych miała sugerować, że są to już jednostki przetwarzające samodzielnie większość operacji strumienia graficznego .
Historia DirectX Następną istotną wersją bibliotek DirectX była wersja 8.0. Zadebiutowała ona we wrześniu 2000 roku i wprowadziła shaderowy model przetwarzania grafiki. Co ciekawe, powstała ona przede wszystkim na potrzeby pierwszej wersji Xbox – konsoli Microsoftu do gier. Najważniejszą nowością w akceleratorach 3D zgodnych z DX 8.0 było pojawienie się programowalnych jednostek Vertex i Pixel Shader. Moduły te potrafią zmodyfikować szkielet sceny oraz użyte do jej budowy tekstury i pojedyncze piksele obrazu już w trakcie przetwarzania ich w potoku graficznym. Co więcej, modyfikacje obiektów mogą być również przeprowadzane na gotowej scenie 3D.
Historia DirectX Do zrealizowania takich operacji wykorzystuje się krótkie programy, nazywane programami shaderowymi. To, co ujrzymy na ekranie, zależy już od fantazji i umiejętności programisty piszącego grę. Za pomocą programów shaderowych można na przykład stworzyć własne efekty graficzne niedostępne w standardowych procedurach DirectX. Koniecznie trzeba tu zaznaczyć, że niezależnie od programów shaderowych, programiści cały czas mogą korzystać z gotowych funkcji zaimplementowanych w bibliotekach DirectX, a kolejne wersje bibliotek są zawsze, niezależnie od wersji, kompatybilne wstecz ze wszystkimi starszymi graficznymi interfejsami programowymi. Kolejne wersje DirectX, a mianowicie 8.1, 9.0, 9.0a, 9.0b i 9.0c, wprowadzały ulepszenia do shaderowego modelu programowania kart 3D, a programiści zaimplementowali szereg nowych graficznych funkcji, niemniej sama architektura bibliotek DirectX nie uległa zmianie.
Historia DirectX 30 listopada 2006 roku oficjalnie zadebiutowały biblioteki graficzne DirectX 10, które znane były wcześniej również pod nazwami Windows Graphics Foundation i DirectX Next. Obecnie DirectX 10 dostępny jest jedynie z systemem operacyjnym Windows Vista, a Microsoft nie przewiduje wersji DirectX 10 dla Windows XP.
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.
DirectX 10 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.
DirectX 10 Rozdzielenie DirectX 10 i DirectX 9 ma bardzo głębokie uzasadnienie. Otóż przy pisaniu każdej kolejnej wersji DirectX programiści wykorzystywali kod z poprzedniej, uzupełniając go i poprawiając. Takie podejście ma oczywiście swoje zalety (program m.in. pisze się znacznie szybciej i nie trzeba za każdym razem implementować na nowo obsługi starszego sprzętu, gdyż w starym kodzie ona po prostu już jest), ale też i swoje wady, z których największą jest przenoszenie dotychczasowych błędów i ograniczeń w funkcjonowaniu aplikacji. Jak można się domyślić, tą metodą powstał DirectX 9.0L. DirectX 10 został natomiast napisany całkowicie na nowo, dzięki czemu uniknięto wielu błędów i zoptymalizowano kod, przystosowując go wyłącznie do nowych kart. Takie podejście pozwoliło zmniejszyć tzw. narzutu interfejsu API na proces tworzenia grafiki, określany angielskim terminem API overhead. Chodzi tutaj o moc obliczeniową CPU wykorzystywaną do obsługi bibliotek graficznych. Dotychczasowe biblioteki DX 9 zużywały ok. 40% cykli procesora przeznaczonych na tworzenie grafiki. W DX10 nakład ten zmniejszono do ok. 20%, dzięki czemu jednostka centralna ma więcej czasu na tworzenie bardziej realistycznej grafiki, bądź może być w tym czasie zaprzęgnięta do zupełnie innych zadań.
DirectX 10 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.
DirectX vs OpenGL DirectX i OpenGL to dwie najważniejsze biblioteki graficzne używane do tworzenia gier i umożliwiające wykorzystanie akceleracji sprzętowej wyświetlania grafiki 3D oferowanej przez współczesne karty graficzne. Obydwie mają praktycznie takie same możliwości. Obydwie mają praktycznie taką samą wydajność. W obydwu da się zaimplementować te same efekty graficzne. Obydwa są darmowe zarówno dla użytkownika jak i programisty.
DirectX vs OpenGL DirectX Twórcą jest Microsoft. Przeznaczony jest na platformy Windows i XBOX. Programowanie wymaga pobrania ze strony Microsoftu darmowego pakietu DirectX SDK o wielkości ponad 300 MB. Nowy SDK wychodzi co ok. dwa miesiące. Użytkownik musi mieć zainstalowaną w swoim systemie odpowiednią wersję DirectX, stosowną do wersji pakietu SDK, w którym program był tworzony. DirectX można pobrać za darmo ze strony Microsoftu. API jest udokumentowane w pakiecie SDK. Jest oparty na technologii COM, a co za tym idzie jego API jest obiektowe, oparte na interfejsach, a każda metoda klasy zwraca wartość błędu typu HRESULT. Od wersji 8 nastąpiła kompletna reorganizacja API, która uczyniła je bardziej przyjaznym i wyeliminowała ścisły podział na część 2D i 3D.
DirectX vs OpenGL DirectX Jest kompletną bilbioteką multimedialną do tworzenia gier, w skład której wchodzą oprócz biblioteki graficznej DirectX Graphics (Direct3D, dawniej także DirectDraw) także biblioteka dźwiękowa (DirectSound, dawniej także DirectMusic), sieciowa (DirectPlay, obecnie niezalecana), do obsługi klawiatury, myszy i manipulatorów (DirectInput) itd. Występuje zjawisko "utraty urządzenia", które z jednej strony umożliwia systemowi zwalanianie pamięci podczas minimalizacji pełnoekranowej gry, ale z drugiej zmusza programistę do obsłużenia tego zdarzenia i ponownego wczytywania zasobów. To duży kłopot. W jego skład wchodzi bogata biblioteka dodatków - D3DX - która zwiera m.in. funkcje matematyczne, wczytujące tekstury z wielu formatów graficznych, wczytujące modele z formatu X, rysujące tekst i wiele innych. Posiada wbudowane funkcje i obiekty uproszczające matematyczną stronę grafiki. Wysokopoziomowym językiem shaderów jest HLSL. Z możliwości nowych kart korzysta się pisząc w nowej wersji DirectX i sprawdzając, czy karta użytkownika posiada daną możliwość (device caps).
DirectX vs OpenGL OpenGL Jest przenośna na wiele platform, w tym Windows i Linux. Jest dostępny standardowo w systemie - programy nie wymagają od użytkownika instalowania żadnej biblioteki. Nagłówki są standardowo dostępne wraz z kompilatorami - programowanie nie wymaga instalowania żadnego pakietu SDK. API jest udokumentowane m.in. w MSDN Library. API jest strukturalne i ma charakterystyczną budowę, na której wzoruje się także wiele innych bibliotek. Niektórzy mówią, że jest prostszy do nauczenia dla początkujących. Inni, że uczy złych nawyków. Z możliwości nowych kart korzysta się za pomocą tzw. rozszerzeń (extensions), które uchodzą za kłopotliwe. Dostępne jest w Sieci chyba więcej edukacyjnych przykładów programów, niż dla DirectX-a.
DirectX vs OpenGL OpenGL Bardziej niż DirectX uchodzi za bibliotekę przeznaczoną do zadań profesjonalnych, jak programy do projektowania czy symulacji. Nie posiada wbudowanych funkcji matematycznych, wczytujących tekstury z plików graficznych itp. Istnieje wiele bibliotek jakby uzupełniających OpenGL w programowaniu gier, np. OpenAL do dźwięku czy DevIL do obsługi formatów graficznych. Trwają dyskusje nad przyszłością na platformie Windows, ponieważ Microsoft zapowiedział, że w nowej wersji - Windows Vista - nie będzie wsparcia dla OpenGL i będzie on emulowany za pomocą DirectX. Wysokopoziomowym językiem shaderów jest GLSL. Przez niektórych uznawany jest za prostszy do nauczenia i lepszy dla początkujących.
KONIEC