» »

DirectX 11

Dve leti že mineva od Microsoftove razgrnitve novega operacijskega sistema Windows Vista, skupaj s katerim je luč sveta ugledala tudi zadnja različica multimedijskih knjižnic DirectX 10. Po rutinskih posodobitvah vsake dva-tri mesece, ki so večinoma posodabljale zgolj HLSL prevajalnik za shaderje, pa je Microsoft v novembersko izdajo DirectX SDK vključil tudi beta oziroma "tech preview" različico prihajajočega DirectX 11.

Torej, kaj je novega?

Začnimo z očitnim... DirectX 10 je povsem prekinil kompatibilnost za nazaj. Samo povsem DirectX 10 GPU-ji lahko uporabljajo DirectX 10 knjižnico. Prejšnje verzije DirectX so vsebovale mehanizem, preko katerega so grafične kartice lahko sporočale svojo funkcionalnost aplikacijam, ki je bil zarad svoje zapletenosti umaknjen iz DirectX 10. Poleg tega je bila umaknjena vsa stara funkcionalnost, ki je bila že na DX8 in DX9 grafičnih karticah implementirana preko shaderjev s strani grafičnega gonilnika. Torej iz knjižnice so se poslovile vse funkcije, ki so bile že v DirectX 7 in preko katerih se je konfigural cevovod na starih GPU-jih.

Kombinatorična eksplozija, vertikala različne funkcije in omejitve, horizontala različne grafične kartice

DirectX 11, tako kot že DirectX 10, zaradi prenovljenega modela gonilnikov v Visti ne bo na razpolago na Windows XP. Bo pa za razliko od predhodnje verzije podpiral starejšo strojno opremo vse do osnovnih različic DirectX 9 GPU-jev. DirectX 11 uvaja različne nivoje funkcionalnosti (ang. feature level), ki zajemajo cele sklope različnih funkcij oziroma omejitev DirectX 9 GPU-jev. Nivojev je trenutno 6:

  1. 9.1 - zajema vse osnovne DirectX 9 grafične kartice npr. GeForce FX in nekatere S3 kartice
  2. 9.2 - vsebuje funkcionalnost na nivoju Radeon 9800, Radeon X800 GPU-jev
  3. 9.3 - zadnja generacija DirectX 9.0 GPU-jev s podporo t.i. shader model 3.0, kot so GeForce 6800 in kasnejše ter Radeon X1800
  4. 10 in 10.1 - ki zajemata današnje DirectX 10 grafične kartice
  5. 11 - kompletna funkcionalnost nove različice DirectX

Namesto vseh mogočih kombinacij imamo vso funkcionalnost združeno v 3 nivoje

Vsak naslednji nivo striktno vsebuje vse prejšnje. Zakaj se to vpeljuje šele sedaj? Ob prihodu DirectX 10 in tudi še danes morajo programerji tako ali tako še vedno podpirati DirectX 9 API zaradi kompatibilnosti z Windows XP in to, da bi lahko v Visti do DX9 GPU-jev dostopali tudi preko DX10, ne bi spremenilo ničesar. Ta poteza je dejansko usmerjena v čas, ko bodo programerji začeli opuščati podporo za Windows XP. Seveda brez ustrezne podpore s strani gonilnikov ne bo šlo. In ker je nov model gonilnikov močno optimiziran za DirectX 10/11 nivo GPU-jev bodo nekatere stvari na DirectX 9 grafičnih tekle počasneje, kot če bi bila uporabljena starejša DirectX 9 knjižnica.

WARP 10 engage!

Ne, ne nič ne bo z zvezdnimi stezami! WARP 10 je kratica za Windows Advanced Rasterizer Platform 10. Gre za hitro in optimizirano softwaresko implementacijo celotne DirectX 10.1 knjižnice, ki teče na centralnem procesorju. "Celotne" pomeni, da podpira tudi do 8x mehčanje robov (antialiasing) in anisotropno filtriranje tekstur (anisotropic filtering). "Hitro in optimizirano" pa pomeni, da je ta softwareska implementacija dovolj hitra za uporabo v interaktivnih okoljih.

Kljub temu, naj se vam ne mudi preveč z metanjem vaših grafičnih kartic skozi okno! WARP 10 je sicer res za faktor 1000 hitrejši od obstoječe neoptimizirane različice "reference rasterizer"-ja, vendar je še vedno bistveno počasnejši od najcenejših DirectX 10 grafičnih kartic. Pri Microsoftu so testirali WARP 10 v igri Crysis, kjer je na najnižjih nastavitvah in pri ločljivosti 800x600 dosegel povprečno 7.36 FPS na procesorju Core i7 pri 3GHz. 2.6GHz Core 2 Duo je zmogel povprečno le 2.83 FPS. GeForce 8400 GS in Radeon 2400 PRO sta oba dosegla povprečje okrog 30 FPS.

Za igre WARP 10 torej ne bo uporaben in dejansko, če ga bodo igre hotele uporabljati, bodo morale zanj eksplicitno zaprositi. Tudi v primeru da v sistemu ne bo DX 10 grafične kartice. Ker pa bo Microsoftov prihajajoči operacijski sistem Windows 7 za grafični vmesnik uporabljal DirectX 10, vam je verjetno jasno kaj je glavni namen WARP 10.

Compute!

Hitro povečevanje računskih zmogljivosti GPU-jev in predvsem njihove vse večje programabilnosti nas je privedlo do tega, da se z grafičnimi procesorji danes spogleduje vse več računsko zahtevnih aplikacij. Fizikalni izračuni v igrah (PhysX), kompresija tekstur (NVIDIA Texture Tools 2), raziskave na področju proteinov (Folding@home),... danes izkoriščajo računsko moč GPU-jev. General Purpose GPU (GPGPU) ima seveda svoj set problemov. Da vam ilustriram: Če postavite neki skupini ljudi, recimo tehnično dobro podkovanih programerjev, nalogo sešteti dve tabeli nekih števil, koliko jih bo prišlo na dan z "Že vem! Spakirajmo obe tabeli v dve teksturi, potem pa izrišemo dva trikotnika, ki bosta zajela celotni teksturi in naredimo seštevanje v pixel shaderju!" Nihče ne razmišlja tako! Vender, ko se je GPGPU začel razvijat je bilo potrebno razmišljat točno tako: programiralo se je splošne probleme, čez knjižnico namenjeno grafiki (Direct3D ali OpenGL). Da se je kaj izračunalo, je bilo potrebno čez pipeline pognati nekaj trikotnikov.

Compute funkcionalnost je zunaj klasičnega cevovoda

To se je seveda zelo hitro popravilo, ko je je NVIDIA prišla na dan z Compute Unified Driver Architecture (CUDA) in ATI z Compute Abstraction Layer (CAL). Zaradi splošne uporabnosti pa je Microsoft tudi v DirectX 11 vključil t.i. compute shaderje, ki so semantično zunaj grafičnega cevovoda. To ima dve veliki prednosti pred CUDA in CAL. Prva je očitna: en jezik in en API (DX 11) na vseh grafičnih karticah (ATI, NVIDIA, Intel,..). Druga pa se skriva v tem, da ko postanejo compute shaderji del DirectX-a dobijo tudi direkten dostop do vseh sredstev, s katerimi DX upravlja. Takšne in drugačne teksture, geometrija,... vse je dostopno brez dodatnega kopiranja po grafični kartici.

Kaj to prinese v igričarsko prakso? Možnost implementacije fizike na grafičnih karticah tako na NV kot ATI GPU-jih z eno samo fizikalno knjižnico. Precej se bo poenostavilo tudi post processing filtre, kjer je potrebno za vsak pixel na zaslonu izvesti neko procesiranje. Lep primer so tudi HDR učinki, za katere je običajno potrebno zreducirati sliko v ločljivosti ekrana (naprimer 1920x1200) v eno samo točko, da ugotovimo kakšna je trenutna osvetlitev slike. To se danes izračunava s postopnim zmanjševanjem ločljivosti, kar nas stane nekaj pomnilnika in preklapljanje med različnimi render targeti (teksture v katere renderiramo). Enostavneje bo tudi programirati razne učinke z delci (particle systems) npr. dim, megla, tekočine,... Obenem pa to omogoča tudi bolj eksotične pristope kot so renderiranje s pomočjo sledenja žarku (ray tracing), voxel rendering,...

Compute shaderji (4.0 in 4.1) bodo dostopni na vsaj nekaterih DirectX 10 grafičnih karticah z ustreznimi DX11 gonilniki. DirectX 11 GPU-ji bodo seveda podpirali še nekoliko več (5.0 compute shaderji).

Teselacija

Krivulje in ukrivljene ploskve so vroč kostanj med grafičnimi karticami že leta in praktično vsaka generacija GPU-jev je imela svoje poskuse v to smer. GeForce 3 je svoj čas podpiral RT zlepke, konkurenčni Radeon pa N zlepke oziroma marketinško imenovano TruForm. Nobena od obeh metod se ni prijela in strojna podpora je bila umaknjena po hitrem postopku. Naslednji poskus je sledil s strani kanadskega ATI, ki je v Xenos čipu (GPU na XBox 360) implementiral teselator pred vertex shaderjem in ker je bila ta funkcionalnost poceni s stališča tranzistorjev so jo vključili v svoje DirectX 10/10.1 grafične kartice. Ponovno pa je funkcionalnost na PC-jih ostala neuporabljena in niti ni del DirectX standarda. DirectX 10 je sicer prinesel geometry shaderje s katerimi je možno nekoliko potipati v to smer, niso pa niti približno namenjeni temu opravilu.

Teselacija nam omogoča, da prestavimo triangulacijo ploskev iz namenskih orodij (Maya, Lightwave,...) na GPU

DirectX 11 prinaša tri nove stopnje v grafični cevovod, ki so namenjene točno za generiranje trikotnikov iz kupa kontrolnih točk. Najprej bo na potezi hull shader, ki bo pripravil kontrolne točke in določil koliko trikotnikov naj se generira. Teselator je nova fiksna enota, ki bo iz kontrolnih točk generirala trikotnike. Sledil pa bo še domain shader, ki bo generirane trikotnike lahko še dodatno obdeloval. Recimo displacement mapping ali pa še kaj bolj inovativnega. Omeniti je potrebno, da vhodni podatki za te tri stopnje niso nujno trikotniki ampak kontrolne točke zlepkov. In ker imajo modelerji običajno opravka z zlepki lahko prestavimo pretvorbo v trikotnike iz orodij kot so Maya in 3DStudio MAX neposredno na GPU. Ob tem pa se izognemo še generiranju večih različic istega modela z različnim številom trikotnikov (t.i. LOD oziroma Level Of Detail), saj bo GPU lahko sam generiral optimalno število trikotnikov glede na oddaljenost modela.

Tri nove stopnje za delo z zlepki

Odprejo pa se še druge možnosti. Animacije karakterjev se lahko poenostavijo, saj se animirajo le kontrolne točke zlepka in ne nekaj 1000 trikotnikov. Ker trikotnike generira GPU lahko tudi zelo natančno kontroliramo koliko trikotnikov bomo sploh generirali. Če imamo na ekranu v nekem trenutku 300 ljudi, bomo za vsakega generirali recimo 100 trikotnikov, če imamo pa na ekranu samo en lik pa si jih bomo privoščili npr. 30000. Ob vseh teh prednostih pa lahko še prihranimo kar znatno količino pomnilnika na grafični kartici (in seveda samega bandwidtha ob renderiranju) saj zlepki zasedejo bistveno manj prostora, kot že triangulirani modeli.

Multi-threading

Vedno več uporabnikov se odloča za večjedrne procesorje, kar ima za posledico potrebo po večnitnem programiranju (multi-threading) iger. Pošiljanje ukazov iz večih niti, ki tečejo na večih jedrih, sicer deluje že v dosedanjih različicah DirectX knjižnice. Vendar se praktično vsak posamezen ukaz znotraj Direct3D sinhronizira in učinek ni kaj prida. Aplikacije oziroma igre, ki razbijejo delo tako da ena nit obdeluje fiziko, druga umetno inteligenco in recimo tretja grafiko so povsem vredu, dokler recimo grafika ne začne blokirat celotnega procesorja.

Grafika lahko komunicira samo v eni niti, ki lahko hitro postane osko grlo

DirectX 11 pa po drugi starni omogoča, da vsaka nit sestavi svojo listo ukazov za grafično kartico. Vse skupaj še vedno mora biti sinhronizirano, vendar je postopek bistveno enostavnejši, saj lahko DirectX samo zlepi liste ukazov iz večih niti skupaj. Namesto sinhronizacije za vsak ukaz posebej imamo tako sinhronizacijo samo za vsake 100 ali 1000 ukazov, kar pomeni bistveno manj medsebojnega čakanja med jedri centralnega procesorja.

To možnost bo mogoče uporabljati na vseh grafičnih karticah, za katere bodo napisani DirectX 11 gonilniki in bo upajmo izboljšala izkoristek večjedernih procesorjev.

Kaj je Å¡e novega?

Poleg vsega že omenjenih novosti DirectX 11 dodaja še dva nova kompresirana formata tekstur, k že obstoječim petim. Prvi je namenjen teksturam v HDR formatih, drugi pa klasičnim LDR formatom.

BC6 je namenjen HDR teksturam

Obstoječi kompresirani formati imajo kar nekaj problemov in razultati so vse preveč kockasti. Nova formata omogočata več barvnih ključev znotraj posameznega bloka, kar občutno zmanjša napake v primerjavi z obstoječimi formati. Na žalost pa bo za ta dva formata potrebno imeti DirectX 11 GPU. Obenem pa se za kompresirane formate po novem zahteva do bita natančno sledenje specifikacijam pri dekodiranju.

BC7 občutno zmanjša kockastost dosedanjih formatov (BC3 = DXTC3)

Glede tekstur je tukaj še nekaj dodatnih sprememb, kot je povečanje največje dovoljene velikosti tekstur na 16384 x 16384 in zahteva za 8 bitno filtriranje. Za primerjavo največja dovoljena velikost tekstur v DirectX 10 je 8192 x 8192 in na zadnjih DirectX 9 GPU-jih 4096 x 4096. Skladno s tem se poveča tudi omejitve velikosti posameznih sredstev, kot so teksture in geometrija na več kot 4GB.

Precejšnje spremembe so tudi na nivoju programiranja shaderjev oziroma HLSL prevajalnika.Ker jasno ni vsa strojna oprema enako hitra, morajo programerji za različno hitre grafične kartice pisati različno kompleksne shaderje. Danes obstajata dve možnosti: Ali programerji napišejo vsak posamezen shader v celoti (kar postane problem za vzdrževanje), ali pa napišejo en sam "uber" shader, ki izklaplja posamezne učinke ali znižuje njihovo kvaliteto (kar postane problem za optimizacijo, ker mora GPU vedno alocirati registre za najslabši možni primer). DX 11 dodaja nekaj bolj objektnih možnosti, ki združujejo prednosti obeh pristopov.

Potem pa je tukaj še zajeten kupček manjših sprememb in dodatkov. Shaderji lahko uporabljajo dvojno natančnost, kar bo prišlo do izraza predvsem za compute funkcionalnost. Pixel shaderji, ki bodo spreminjali globino pixla, bodo lahko sporočili mejo za koliko bodo vrednost spremenili, tako da spremembe globine ne bo več nujno pomenile izklopa lepega dela Fast Z-Cull/HyperZ optimizacij na grafičnih karticah. Nova je tudi podpora za t.i. neurejene poglede, pri katerih nas ne zanima vrstni red elementov in jih zato lahko GPU obdeluje kakor se mu zljubi. Torej, če nas ne zanima ali bo pixel končal v desnem zgornjem ali v levem spodnjem kotu zaslona, samo da se bo nekje izrisal, potem bomo lahko uporabili neurejen pogled na neko teksturo in pixli bodo padali nanjo tako kot padajo iz cevovoda.

Za konec

Trenutno na trgu še ni iger, ki bi zahtevale DirectX 10 za svoje delovanje, niti ni iger, ki bi dodobra izkoristile vse kar DirectX 10 ponuja. Vseeno pa DirectX 11, predvsem s podporo obstoječe strojne opreme, daje slutiti, da se bo prijel precej hitreje kot njegov predhodnik. Poživitev DX10 GPU-jev s compute shaderji pa je pravtako dobrodošla in glede na precej dolg čas razvoja novih iger, lahko razvijalci melce bolj oddaljenih iger mirno preklopijo na nov API.

Čudežno popotovanje skozi grafični cevovod

Čudežno popotovanje skozi grafični cevovod

Trenutno očitno živimo v obdobju, ko razni *PU-ji (Processing Unit) rastejo kot gobe po dežju. Nedolgo tega je tržne police ugledal prvi pospeševalnik fizikalnih izračunov (PPU ali Physic Processing Unit) PhysX podjetja Ageia. In ker to očitno še vedno ni dovolj, ...

Preberi cel članek »

Čudežno popotovanje skozi grafični cevovod II

Čudežno popotovanje skozi grafični cevovod II

V prvem delu smo si ogledali strukturo sodobne grafične kartice. Med drugim smo omenili shaderje, ki so zaradi svoje programabilnosti, nekakšno srce in duša sodobnih GPU-jev. Različni shaderji so odgovorni za različne strukture v grafiki (v Direct3D 10 so to oglišča, ...

Preberi cel članek »

DirectX 9.0 - Izboljšave knjižnice

DirectX 9.0 - Izboljšave knjižnice

V prejšnjem delu smo si ogledali novosti in izboljšave, ki so doletele programabilnost grafičnih kartic, torej osenčevalnike točk ter oglišč. Seveda pa novi pixel in vertex shaderji niso edina novost v DirectX 9.0. Novosti je še kar nekaj, vendar je res, da je ...

Preberi cel članek »

Novosti DirectXa 9 - 1. del

Novosti DirectXa 9 - 1. del

No pa smo vendarle dočakali novo, dolgo pričakovano, različico knjižnice DirectX, ki jo je zlobni Microsoft, bolj ali manj skrbno skrival pred radovednimi očmi javnosti. V približno enaki tajnosti sta nastala tudi ta dva članka, ki vam bosta, vsaj upam tako, uspela ...

Preberi cel članek »

ATI Radeon 9700 - Nov kralj v grafični deželi

ATI Radeon 9700 - Nov kralj v grafični deželi

Če ne živite ravno v kakšnem zakotnem pragozdu ter lahko berete ta članek, potem ste gotovo že slišali, da je ATi izdal nov grafični čip R300, ki so ga poimenovali Radeon 9700. Kot verjetno že veste, novi Radeon s precejšjno lahkoto pomete z vso konkurenco ...

Preberi cel članek »