Benvenuti al primo articolo della sezione DirectX11 in cui cercherò di introdurvi all'utilizzo delle ultimissime DirectX11. In questo primo tutorial spiegherò cosa è DirectX e cosa è cambiato per coloro che stanno passando alle nuove API.
DirectX11 è l’ultima API realizzata da Microsoft per la gestione dei componenti multimediali del pc. DirectX comprende 3 categorie: Audio, Input e Grafica.
Queste a loro volta comprendono diversi componenti in grado o meno di interagire tra di loro.
La parte audio comprende questi componenti
· DirectSound: la vecchia libreria di gestione audio wave.
· XAudio2: la nuova libreria di gestione audio per giochi ed applicazioni
· X3DAudio: interfaccia che si appoggia ad XAudio per realizzare suoni 3D
· XApo: componente per la gestione di effetti audio, anch’esso appoggia su XAudio
· XApoFx: set di effetti già pronti e che quindi rappresenta un’espansione di XApo
· XAct3: questo è di fatto un engine audio già pronto per la gestione avanzata di suoni. Tramite un tool fornito nella SDK si possono realizzare in un file un’intera libreria audio da richiamare tramite semplici metodi.
La parte input comprende 2 componenti:
· DirectInput: la vecchia API per la gestione di periferiche come joypad, mouse e tastiere
· XInput: questa API estremamente semplice permette di gestire solamente periferiche compatibili con il nuovo standard. Di conseguenza solo i controller XBox ed i nuovi pad possono essere utilizzati.
La parte grafica è la parte centrale di DirectX e comprende diversi componenti:
· DXGI: è l’interfaccia grafica di base per Direct3D10, 11, Direct2D e DirectWrite, permette di creare connessioni dirette con la scheda grafica ed il monitor in modo da accedere alle aree in cui le immagini generate dai vari componenti andranno a visualizzarsi.
· Direct3D9: rilasciata a fine 2002 è ancora ampiamente utilizzata per supportare le schede grafiche di vecchia generazione ed i possessori di Windows XP che non è compatibile con le ultime versioni Direct3D. Inoltre la XBox 360 di Microsoft utilizza una versione modificata di Direct3D9. Per questo, nonostante gli anni, è ancora ampiamente utilizzata.
· Direct3D10: Rilasciata nel 2006 è stata il punto di svolta della struttura di Direct3D creando uno strato base per le future versioni. Nonostante le moltissime novità e potenzialità è stata anche la versione più sfortunata in quanto incompatibile con Windows XP, un sistema operativo che non è mai stato pienamente sostituito da Windows Vista.
· Direct2D: Nuovissimo componente dedicato alla grafica bidimensionale. Per chi è pratico nell’utilizzo delle GDI si può definire come una sua evoluzione. La differenza chiave è che Direct2D utilizza la scheda video anziché la CPU rendendo la gestione molto più veloce e allo stesso alleggerendo il carico sul processore. Moltissimi software iniziano ad utilizzarla per il rendering della GUI tra cui anche diversi browser web.
· DirectWrite: In coppia con Direct2D gestisce il rendering di testo con supporto a funzionalità avanzate per i font e la formattazione.
· Direct3D11: questo è il componente chiave dell’ultima release DirectX e sarà oggetto di questo articolo.
Direct3D11
Segue il cammino introdotto da Direct3D10 da cui eredita la struttura e le funzionalità. Di fatto per chi inizia a programmare in Direct3D11 noterà che la creazione e gestione delle risorse è rimasta esattamente la stessa . L’unica differenza è l’introduzione del DeviceContext. Dato che il Device si arricchiva di funzionalità è stato spezzato in 2 parti, una dedicata alla creazione di risorse, il Device appunto, ed una all’utilizzo, il device context. I metodi sono però rimasti gli stessi, a parte ovviamente quelli introdotti per le nuove funzionalità.
DirectX11 introduce pochi ma significativi componenti.
· ShaderModel5: Introduce una serie di nuove funzionalità nel linguaggio HLSL. La più significativa è la possibilità di definire classi. Potrete creare classi base ed interfacce nei vostri shader per poi istanziarle a run time con le classi che preferite. In questo modo HLSL diventa un vero linguaggio Object Oriented, molto utile visto che ormai i giochi sono arrivati a contenere anche migliaia di codici shader.
· Tessellation: Probabilmente il componente più innovativo ed appariscente. Attraverso l’utilizzo di 2 nuovi shader (HULL e Domain) è possibile aumentare in modo significativo il numero di triangoli presenti nel modello, permettendo anche di variarne posizione ed aspetto. L’utilizzo principale è quello di poter aumentare la definizione del modello, magari in base alla distanza. Gli oggetti più vicini saranno più ricchi di poligoni e, con l’utilizzo di texture, sarà possibile anche creare veri rilievi nel modello, cosa che prima non poteva essere fatta se non a livello di normal map che di fatto creavano solo l’illusione del rilievo.
· Multithreating: Fornisce una gestione migliorata per la creazione ed il rendering utilizzando il multithread. Ad esempio è possibile creare risorse mentre la grafica avanza senza dover fare alcun intervento oppure mandare in esecuzione un set di operazioni mentre il vostro gioco procede. Sono stati inoltre introdotti metodi per la sincronizzazione dei thread.
· DirectCompute: questo componente è di fatto un sistema per utilizzare Direct3D per il calcolo numerico. Una scheda video lavora in modo molto efficiente su processi che possono essere calcolati in parallelo. Tutti quei calcoli che richiedono di elaborare moltissime istanze di una stessa operazione potranno utilizzare Direct Compute per accelerare in modo esponenziale le loro procedure.
DirectX11 a differenza di DirectX10 che tagliava la compatibilità sia software che hardware, evita lo stesso errore del suo predecessore. DirectX11 è compatibile infatti anche con Windows Vista oltre che con Windows 7 (ma non con XP) e supporta schede grafiche DirectX9 e DirectX10. Questo però senza tradire l’innovazione introdotta: quella di creare configurazioni standard. Infatti dovrete controllare 1 solo parametro: il feature level per sapere cosa potrete e non potrete utilizzare.
I feature level sono caratteristiche comuni per un hardware video che si configurano in 6 modalità:
· Level9.1
· Level9.2
· Level9.3
· Level10
· Level10.1
· Level11
Leggendo la tabella di configurazione presente nella SDK sarete sicuri di ciò che potrete utilizzare (ad esempio il tessellation è disponibile solo in Level11 mentre il geometry shader fin dal 10). Per il resto però le procedure di utilizzo rimarranno le stesse rendendo pertanto inutile utilizzare Direct3D10 anche per prodotti compatibili con hardware DirectX10.
Differenze con DirectX10
Le DirectX11 portano alcune differenze. La prima, come menzionata sopra, è la suddivisione del controller principale in Device E DeviceContext, il primo adibito alla creazione delle risorse, il secondo all’utilizzo. Il motivo sta unicamente nel fatto che con l’introduzione di altri 3 modelli di shader (Domain, Hull e Compute) sono aumentate le istruzioni e la cosa ha reso il tutto più ordinato. La seconda importante modifica è il declassamento degli Effect da interfaccia principale a secondaria. Di fatto non esiste un componente per la gestione degli effetti ma un frame work separato all’interno della SDK da utilizzare. Lo svantaggio è che questo codice verrà inserito direttamente nel vostro eseguibile, il vantaggio è che potete non utilizzarlo e soprattutto Microsoft ha deciso di darcene il sorgente. Potrete quindi metterci mano e modificarlo come preferite. Dal mio punto di vista però ho deciso di non utilizzare più gli effect per un semplice motivo: è solo un layer sopra ai normali oggetti shader. Questo significa che l’utilizzo del set di classi Effect aumenta notevolmente il numero di operazione che il device esegue peggiorando non di poco le performance. I tutorial che troverete saranno basati su shader semplici ma non temete, non sono difficili da digerire e soprattutto permettono ottimizzazioni impossibili con gli effect.
In quest’ottica sono state tagliate fuori alcune utili classi come gli Sprite, i Font e le Mesh. Purtroppo al momento della scrittura dell’articolo non esiste un sostituto se non nel codice degli esempi Microsoft. Il motivo è probabilmente lo stesso: convincere i programmatori ad ottimizzare i loro progetti e a mantenere flessibilità. Di fatto molto delle D3DX, il set di classi e metodi di utilità, sono stati notevolmente ridotti.
Gli sprite come i font e le mesh sono oggetti che di fatto utilizzano gli oggetti fondamentali di Direct3D. Ricrearli è abbastanza semplice quindi riusciremo a farne a meno.
Una nota molto positiva invece è l’introduzione del frame work XNAMath che comprende un set migliorato di vettori e matrici. Ci sono molti più metodi ed utilità e soprattutto sfruttano le istruzioni speciali dei processori per la gestione delle operazioni matematice (SSE di Intel ad esempio). Potrete scegliere se utilizzare la nuova interfaccia o rimanere alla vecchia D3DX.
Cosa serve per iniziare?
· Innanzitutto l’ultima SDK Microsoft (gratuita) scaricabile dal sito http://msdn.microsoft.com/en-us/directx/default.aspx. Questa contiene le librerie necessarie per programmare in DirectX oltre alla documentazione, esempi e tool.
· Visual Studio (professional o Express, quest’ultimo fornito gratuitamente da Microsoft).
· Un editor 3D (per realizzare modelli 3D da caricare nei progetti). Ne esistono moltissimi, sia free che a pagamento.
· Windows 7 o Windows Vista SP2 con installato il platform update
· Conoscenza base di C++, e matematica, con risalto alla trigonometria, geometria, calcolo matriciale e vettoriale.
· Una scheda video DirectX11 o almeno DirectX10 (con quest’ultima però non potrete utilizzare a pieno tutte le funzionalità di Direct3D11)
E se conosco solo .Net?
Microsoft non ha rilasciato un componente ufficiale per la programmazione di DirectX11 in .Net ma esistono diversi componenti realizzati dalla comunità. Per citarne alcuni SlimDx o Windows Api Pack. Questi non sono altro che librerie scritte in C++/Cli che espongono i metodi C++ per .Net. La realizzazione di una simile libreria è estremamente semplice.
Per avere un componente di cui avere pieno controllo senza dovermi adeguare a tempistiche non mie, ho realizzato a mia volta un componente .Net che ricopre l’intero set di funzioni DirectX. Già da tempo viene utilizzato in miei test e progetti e risulta essere stabile in ogni sua parte. Ad ogni aggiornamento della SDK sarà mia premura aggiornare i componenti e pubblicarli.
Gli articoli DirectX11 saranno corredati di sorgenti sia C++ che .Net utilizzando il mio wrapper. Dato che saranno articoli volti a spiegare come funziona DirectX potranno essere utilizzati per qualsiasi sistema voi preferiate. Il linguaggio sarà il C# e la versione di Visual Studio la 2008.
Buon lavoro