# DirectX

DirectX (in origine chiamato "Game SDK") è una collezione di API per lo sviluppo semplificato di videogiochi per sistema operativo Microsoft Windows. Il kit di sviluppo (SDK) è disponibile gratuitamente sul sito di Microsoft. Le DirectX sono state distribuite dai produttori di giochi stessi assieme al videogioco, ma sono anche incluse direttamente nel sistema operativo. In Windows XP è presente la versione 9.0c delle librerie, in Windows Vista è possibile installare la versione 11 con specifici aggiornamenti, in Windows 7 e 8 la versione 11 è già inclusa, mentre in Windows 10 e in Windows 11 è già presente la versione 12 anche per Linux.

## DirectX API

I vari componenti delle librerie DirectX sono disponibili al programmatore come oggetti corrispondenti alle specifiche COM.
I componenti compresi in DirectX 9.0c sono:
* DirectX Graphics: permette la presentazione a video di grafica 2D e 3D, interfacciandosi direttamente con la scheda video. Permette al programmatore di sfruttare direttamente le potenzialità dell'hardware del PC, eludendo Graphics Device Interface (GDI) e Display Device Interface (DDI) di Windows. Le funzioni non supportate dall'hardware vengono emulate via software dalle DirectX grazie al Hardware Emulation Layer (HEL). È composto da una API di basso livello (Direct3D) ed una di alto livello (Direct3DX).
** Direct3D: è concepito per applicazioni grafiche complesse che richiedono un'alta frequenza di aggiornamento dello schermo (come per esempio i videogiochi). Fino alla versione 8.0 esistevano DirectDraw (grafica 2D) e Direct3D (solo grafica 3D), di cui nelle ultime versioni è rimasto solo l'API per la grafica tridimensionale (che all'occorrenza renderizza anche in 2D sfruttando poligoni texturizzati senza prospettiva).
** Direct3DX: si basa su Direct3D per offrire potenzialità simili con minore complessità.
** DirectX Raytracing: ray tracing in tempo reale per DirectX 12, abbreviato DXR.
* DirectInput: gestisce l'input dato dalla tastiera, dal mouse, dal joystick o da qualsiasi altra periferica di gioco, bypassando il sistema di messaggi di Windows e accedendo direttamente all'hardware, sia esso analogico o digitale. Supporta gli effetti di Force Feedback.
* DirectPlay: fornisce supporto ai giochi di rete. Consiste principalmente in un protocollo a livello "applicazione" (vedi il modello OSI) che gestisce oggetti logici quali la Sessione di gioco e i Giocatori (differenziati in remoti e locali). Generalmente però l'uso di DirectPlay è connesso ad un notevole sovraccarico di comunicazione, per cui ha ricevuto un'accoglienza tiepida tra gli sviluppatori, i quali sono ricorsi più spesso a implementazioni di rete ad-hoc tramite socket (che permette l'eventuale compatibilità con server di gioco su Linux, cosa impossibile con le DirectX legate al sistema operativo Microsoft). DirectPlay è ancora incluso nella DirectX, ma non viene più sviluppato. (Questa funzione è rimossa di default su Windows 8.1, ma è possibile reinstallarla tramite "Programmi e funzionalità").
* DirectSound: si interfaccia con la scheda audio per la riproduzione e la registrazione di effetti sonori. Supporta l'audio posizionale (che simula la spazialità del suono in 3D). I suoni possono essere modificati da effetti da diversi buffer di ingresso (Secondary Sound Buffers), dopodiché vengono missati insieme nell'unico buffer di uscita (Primary Sound Buffer). I buffer di ingresso possono essere statici (da file) o dinamici (streaming da un microfono, ecc.) e la loro quantità dipende esclusivamente dalla potenza computazionale del computer. DirectSound si può appoggiare sulle funzionalità della scheda audio, nel caso supporti gli effetti richiesti. Tra gli effetti ci sono il volume, l'equalizzazione, il panning, il riverbero, la distorsione, vari effetti tridimensionali e la simulazione dell'effetto Doppler.
* DirectMusic: supporta la riproduzione di musica (MIDI, ma non MP3). Offre la funzionalità di un sintetizzatore software all'occorrenza.
* DirectShow: gestisce diversi file multimediali (per esempio filmati MPEG o audio MP3) e supporta lo streaming via Internet.
* DirectSetup: permette al programmatore di rivelare le DirectX installate e aggiornarne i componenti durante l'installazione del proprio programma.
* DirectX Media Objects: permette la modifica di streams audio e video, così da poterli poi riprodurre tramite DirectShow o DirectSound.

## Storia

Originariamente destinate all'industria degli sviluppatori di videogiochi, le DirectX sono diventate molto usate anche presso industrie di altri generi di software. Ad esempio, Direct3D è sempre più popolare nel campo dell'ingegneria, grazie alla capacità di renderizzare velocemente grafica 3D di alta qualità, usando le ultime schede video 3D.
Nel 1994, Microsoft era sul punto di mettere in commercio il nuovo sistema operativo - Windows 95. Il fattore principale che avrebbe determinato il gradimento degli utenti per questo nuovo sistema operativo sarebbe stato quali programmi si sarebbero potuti eseguire su macchine che lo utilizzavano. Microsoft era preoccupata, perché i programmatori tendevano a vedere il precedente sistema operativo Microsoft, DOS, come migliore piattaforma per la programmazione di videogiochi, il che significava che pochi giochi sarebbero stati sviluppati per Windows 95 ed il sistema operativo non avrebbe avuto molto successo.
DOS permetteva accesso diretto alle schede video, tastiere e mouse, periferiche audio e a tutte le altre parti del sistema operativo, mentre Windows 95, con il suo nuovo modello plug-and-play, limitava l'accesso a tutti questi dispositivi, lavorando su un modello più standardizzato. Microsoft aveva bisogno di un modo per fornire ai programmatori quello che volevano, e subito, visto che il sistema operativo era a pochi mesi dalla distribuzione. Microsoft iniziò a sviluppare internamente un API grafica iniziando verso la fine del 1994, ma dopo molti mesi Microsoft decise che il tempo non era sufficiente a permetterle di creare da zero l'API. Nel febbraio 1995, Microsoft prese la decisione di acquisire British 3D Rendermorphics compreso il suo laboratorio API, 3D graphics API Reality Lab, risviluppando l'API che prese il nome di DirectX.
La prima versione di DirectX fu distribuita nel settembre 1995 col nome di Windows Games SDK. Era l'API Win32 che avrebbe sostituito l'API insufficiente e nata male per il sistema operativo Win16 (DCI e WinG). Lo sviluppo di DirectX fu seguito dal team di Craig Eisler (capo progetto), Alex St. John (evangelista tecnologico), e Eric Engstrom (program manager). Detto in parole semplici, permise a tutte le versioni di Microsoft Windows, a partire da Windows 95, di incorporare multimedia di alta qualità.
Prima dell'esistenza di DirectX, Microsoft aveva già incluso OpenGL sulla propria piattaforma Windows NT. A quel tempo, OpenGL richiedeva hardware di alto livello ed era limitato all'uso ingegneristico e CAD. Direct3D avrebbe dovuto essere un piccolo aiuto per OpenGL orientato ai giochi. Con la crescita della potenza delle schede video e dei computer su cui girano, OpenGL diventò la corrente principale. A questo punto iniziò una "battaglia" tra gli ammiratori di OpenGL (multipiattaforma) e di Direct3D (solo Windows), che molti definirono come un altro esempio della tattica Microsoft. Tuttavia, le altre API di DirectX sono spesso combinate con OpenGL in molti videogiochi dal momento che OpenGL non include tutte le funzionalità di DirectX (come ad esempio il supporto per il suono o il joystick). Molti tentativi in questo senso sono falliti.
DirectX è stato usato come base per l'API della console Xbox della Microsoft. L'API è stata sviluppata in collaborazione tra Microsoft e nVidia, che ha sviluppato l'hardware usato nella console. L'API della Xbox è simile alla versione 8.1 di DirectX, ma non è aggiornabile a differenza di altre tecnologie per console.

## Versioni
### DirectX 8

Con la versione 8 sono stati introdotti i wrapper per il .NET Framework in modo da poter sviluppare direttamente con questa piattaforma.

### DirectX 9

Nel 2002, Microsoft ha distribuito DirectX 9 con il supporto per l'uso con programmi più complicati di prima, con pixel and vertex shader versione 2.0. Microsoft ha continuato ad aggiornare DirectX aggiungendo le funzioni di shader model 3.0 in DirectX 9.0c nell'agosto 2004.

### DirectX 10

Le DirectX10 hanno nuove DLL più veloci grazie anche all'abbandono della retrocompatibilità con le versioni precedenti. Questa non viene quindi gestita dalle DirectX 10, bensì dalle DirectX 9.0L che sono parallelamente presenti nel sistema operativo Windows Vista. Supporto dello Shader Model 4.0 e dei Geometry Shaders o shader unificati. Gli shader unificati permettono di usare una qualsiasi delle unità shader disponibili sulla scheda grafica, indifferentemente per il calcolo dei pixel, vertici, geometrie, ecc. in questo modo è possibile sfruttare in ogni momento tutta la potenza di calcolo della scheda grafica. Le DirectX 10 grazie al nuovo kernel di Windows Vista, permettono di renderizzare scene più complesse con un minor intervento della CPU, mediante una gestione del bilanciamento di carico fra la CPU e la GPU, con ottimizzazione dei trasferimenti. Viene drasticamente ridotto l'object overhead ossia il tempo di calcolo aggiuntivo per creare gli oggetti, grazie al fatto che con le DX10 la creazione avviene direttamente sulla GPU senza passare prima per la CPU per ogni oggetto (mentre con le DX9 già a partire da 500 oggetti il collo di bottiglia tra le API e la CPU diventava percepibile e le prestazioni diminuivano nettamente).
DirectX10 ha apportato grossi cambiamenti che rivoluzionano il modo di scrivere applicazioni RealTime, e ora ne analizzeremo alcuni.

#### Rimozione completa della fixed pipeline

In DirectX10 vi è una filosofia diversa nell'utilizzo di Device. Ora viene visto non come il centro di controllo totale di una applicazione, ma i suoi compiti vengono alleggeriti ponendolo su un piano di risorse, qualsiasi cosa serva (una texture, una vertex buffer o altro) deve e può essere creato soltanto tramite il device. Quindi non vi saranno più le tipiche funzioni per agire via device sul rendering, come possiamo vedere in questo esempio di D3D9.
Supponiamo sia device un puntatore alla classe IDirect3DDevice9 validato e funzionante
In questo piccolo esempio è possibile rendersi conto che tutto ciò che deve essere immesso per il rendering viene fatto via Device. Questa è chiamata fixed pipeline. In D3D10 questa viene abolita, sostituendola con gli Shader: quindi ogni applicazione D3D10 dovrà essere corredata da almeno uno shader, altrimenti non sarà possibile renderizzare nulla.
Questa rivoluzione porterà significative difficoltà a chi vuole avvicinarsi al mondo del 3D tramite Direct3D10, in quanto capire il meccanismo di rendering sarà più difficile.

#### Cambiamenti in D3DX

D3DX, la famosa lib nata con DirectX8 per facilitare il compito ai programmatori, è stata modificata.
Per prima cosa, molte funzioni e classi sugli shader (D3DXCompileShaderFromFile, D3DXAssembleShaderFromFile) sono state passate da D3DX a D3D. Ciò vuol dire che sono passate dalla libreria ausiliaria a quella principale. Ciò sottolinea ancora di più il fatto che lo shader sta diventando fondamentale in Direct3D10. Sono state completamente rimosse varie classi per la gestione delle animazioni (ID3DXAllocateHiearchy, D3DXMeshContainer, D3DXFrame), ciò vuol far intendere un nuovo sistema di animazioni. Di ciò, gioiranno molto i programmatori che a lungo tempo hanno criticato il sistema di animazioni di Direct3D9, forse un po' troppo antipatico da gestire.

#### Lost Device automatico

Direct3D10 è automaticamente in grado di gestire i lost device, ossia quelle condizioni in cui si perde il rendering della scena, ad esempio quando viene ridotta a icona una finestra in cui vi è un'applicazione D3D10. Con Direct3D9 in quel momento era necessario fermare il rendering, poiché nessuno avrebbe visto il risultato del disegno. Inoltre gestisce il recupero di device quando si passa da stato di stallo a disegno (da ridotto a icona a ingrandito). Prima era necessario, in ogni frame, controllare lo stato del device, e resettare se ve ne era bisogno, in questo modo
Dove d3dpp è una struttura che contiene vari settaggi del device (dimensioni del backbuffer, finestra su cui disegnare, ecc.).
Inoltre la funzione TestCooperativeLevel è stata sostituita dalla funzione CheckDeviceState che restituisce molte più informazioni rispetto alla precedente.

#### Geometry Shaders

Nel nuovo Shader Model 4.0, vi sono i geometry shader, non indispensabili per un gioco, ma saranno di estrema utilità. Questi possono essere considerati come un'estensione del vertex shader. Il vertex shader, come dice il nome, può processare solo un vertice per volta, mentre i geometry shader saranno in grado di gestire intere geometrie.
Per ogni vertice il vertex shader restituisce 1 vertice, dunque non può leggere i dati dai vertici vicini (ciò inibisce varie tecniche: ad esempio risalire dal vertice che si sta leggendo al triangolo di appartenenza): il vertex shader infatti riceve un float4 che indica la sua posizione iniziale, e ne restituisce un altro che indica la sua nuova posizione (che può anche rimanere invariata). Il geometry shader invece riceve in input 1 vertice o un triangolo o fino a 6 triangoli, ma restituisce 1 o più primitive.
Ciò significa che da un semplice triangolo in input è possibile creare anche 1000 triangoli senza doverli disegnare come si fa normalmente (ossia creare un vertex buffer o index buffer). È possibile quindi variare continuamente il numero di triangoli da disegnare, a seconda della lontananza, inibendo le funzioni D3DX riguardo al numero dei vertici da disegnare in una data mesh.
Il geometry shader permette di scrivere un codice che in hardware crea triangoli dal nulla. Ciò può sembrare inutile, ma vediamo un piccolo esempio pratico.
Di solito, per disegnare il mare in modo realistico, si usa fare un'enorme griglia di punti e farli oscillare. Ciò occupa molta memoria.
Ma se la telecamera si trova a notevole distanza dal mare, è inutile farlo troppo dettagliato in quanto la lontananza impedisce di vedere i fini dettagli. Sarebbe quindi utile proporzionare i dettagli alla distanza del mare.
Usando i geometry shader sarà possibile calcolare dalla distanza il numero di poligoni, riducendoli addirittura a 2! E poi man mano che ci si avvicina si potrà aumentare il numero di questi ultimi, avendo allo stesso tempo un effetto realistico che consumerà risorse in proporzione al bisogno.
Altre applicazioni dei geometry shader saranno nelle ombre in stencil, che il motore grafico di Doom3 gestiva via CPU, rendendo il gioco molto pesante.

### DirectX 11

La versione 11 delle DirectX venne annunciata a Seattle durante il GameFest 08. Inizialmente rivolta a Windows 7 venne poi portata anche su Vista. È un superinsieme delle DirectX 10, cioè ne mantiene tutte le API e aggiunge nuove funzioni solo se necessario. In particolare, con questa versione delle librerie fa la sua comparsa la tassellazione hardware, che migliora molto il realismo delle scene 3D in tempo reale. Altre novità importanti sono il supporto GPGPU con la API DirectCompute e l'adozione dello Shader Model 5; molto migliorato anche il supporto al multithreading. Le caratteristiche delle DX11 (tranne lo Shader Model 5) possono essere supportate anche da hardware compatibile DX9 o DX10.

### DirectX 12

La versione 12 delle DirectX venne annunciata da Microsoft alla Game Developer Conference il 20 marzo 2014. Rivolta esclusivamente a Windows 10 e non compatibile con i sistemi operativi precedenti, la sua caratteristica di gran lunga più importante è una API di basso livello, simile a quanto già sviluppato da AMD con Mantle, Apple con Metal e dal Khronos Group con Vulkan. La nuova API, come quelle dei concorrenti, è molto più snella e veloce, permettendo una velocità di rendering superiore. Per contro, lo sviluppatore deve farsi carico di tutta la gestione della memoria. Altre novità importanti delle DX12 sono: l'introduzione del supporto ufficiale della modalità multi-GPU, che prima era lasciata all'implementazione dei costruttori di schede video. E l'introduzione del ray tracing per la serie di schede video Nvidia GeForce 20.

### Cronologia versioni

| Versione DirectX | Numero di versione | Sistema operativo | Data di distribuzione |
| DirectX 1.0 | 4.02.0095 | | 30 settembre 1995 |
| DirectX 2.0 | ? | Inviata solo con alcune applicazioni 3D party | 1996 |
| DirectX 2.0a | 4.03.00.1096 | Windows 95 OSR2 e Windows NT 4.0 | 5 giugno 1996 |
| DirectX 3.0 | 4.04.00.0068 | | 15 settembre 1996 |
| DirectX 3.0 | 4.04.00.0069 | La versione successiva delle DirectX 3.0 incluse Direct3D 4.04.00.0069 | 1996 |
| DirectX 3.0a | 4.04.00.0070 | Windows NT 4.0 Service Pack 3 (e versioni successive) Ultima versione supportata di DirectX per Windows NT 4.0 | dicembre 1996 |
| DirectX 3.0b | 4.04.00.0070 | Fu un aggiornamento minore alla 3.0a che risolse un problema estetico con la versione giapponese di Windows 95 | dicembre 1996 |
| DirectX 4.0 | Mai distribuito | | |
| DirectX 5.0 | 4.05.00.0155 (RC55) | Disponibile come beta per Windows NT 5.0, ma installabile anche su Windows NT 4.0 | 16 luglio 1997 |
| DirectX 5.2 | 4.05.01.1600 (RC00) | DirectX versione 5.2 per Windows 95 | 5 maggio 1998 |
| DirectX 5.2 | 4.05.01.1998 (RC0) | DirectX versione 5.2 per Windows 98 | 5 maggio 1998 |
| DirectX 6.0 | 4.06.00.0318 (RC3) | Windows CE come implemento su on Dreamcast | 7 agosto 1998 |
| DirectX 6.1 | 4.06.02.0436 (RC0) | | 3 febbraio 1999 |
| DirectX 6.1a | 4.06.03.0518 (RC0) | Esclusiva Windows 98 SE | 5 maggio 1999 |
| DirectX 7.0 | 4.07.00.0700 (RC1) | | 22 settembre 1999 |
| DirectX 7.0 | 4.07.00.0700 | Windows 2000 | 17 febbraio 2000 |
| DirectX 7.0a | 4.07.00.0716 (RC0) | | 8 marzo 2000 |
| DirectX 7.0a | 4.07.00.0716 (RC1) | | 2000 |
| DirectX 7.1 | 4.07.01.3000 | Esclusiva Windows Me | 14 settembre 1999 |
| DirectX 8.0 | 4.08.00.0400 (RC10) | | 12 novembre 2000 |
| DirectX 8.0a | 4.08.00.0400 (RC14) | Ultima versione supportata per Windows 95 | 5 febbraio 2001 |
| DirectX 8.1 | 4.08.01.0810 | Esclusiva Windows XP, Windows Server 2003 e Xbox | 25 ottobre 2001 |
| DirectX 8.1 | 4.08.01.0881 (RC7) | Versione per sistemi operativi precedenti (Windows 98, Windows Me e Windows 2000) | 8 novembre 2001 |
| DirectX 8.1a | 4.08.01.0901 (RC?) | Questa versione include un aggiornamento per Direct3D (D3d8.dll) | 2002 |
| DirectX 8.1b | 4.08.01.0901 (RC7) | Questo aggiornamento include un fix per DirectShow su Windows 2000 (Quartz.dll) | 25 giugno 2002 |
| DirectX 8.2 | 4.08.02.0134 (RC0) | Come le DirectX 8.1b con l'aggiunta di DirectPlay 8.2 | 2002 |
| DirectX 9.0 | 4.09.00.0900 (RC4) | | 19 dicembre 2002 |
| DirectX 9.0a | 4.09.00.0901 (RC6) | | 26 marzo 2003 |
| DirectX 9.0b | 4.09.0000.0902 (RC2) | | 13 agosto 2003 |
| DirectX 9.0c | 4.09.00.0903 | Esclusiva Windows XP Service Pack 2 | |
| DirectX 9.0c | 4.09.00.0904 (RC0) | | 4 agosto 2004 |
| DirectX 9.0c | 4.09.00.0904 | Windows XP Service Pack 2, Windows Server 2003 Service Pack 1, Windows Server 2003 R2 e Xbox 360(versione modificata) | 6 agosto 2004 |
| DirectX 9.0c - update periodici | 4.09.00.0904 (RC0) | Quella del 13 dicembre 2004 è l'ultima versione solamente a 32-bit sufficiente per Windows Me e Windows 2000 32-bit. | Aggiornamenti bimestrali dall'ottobre 2004 all'agosto 2007, e successivamente trimestrali; Ultima versione: novembre 2010 |
| DirectX 10 | 6.00.6000.16386 | Esclusiva di Windows Vista | 30 novembre 2006 |
| DirectX 10 | 6.00.6000.00000 | Edizione modificata per Windows XP da KM-Software | 4 dicembre 2007 |
| DirectX 10 | 6.00.6001.18000 | Windows Vista SP1, Windows Server 2008 include la Direct3D 10.1 che introduce gli shader model 4.1 | 4 febbraio 2008 |
| DirectX 11 | 6.01.7600.16385 | Windows Vista SP2 e Server 2008 SP2, attraverso l'aggiornamento Aggiornamento della Piattaforma per Windows Vista e un ulteriore aggiornamento da Windows Update, 7 e Server 2008 R2 | 27 ottobre 2009 |
| DirectX 11.1 | 6.02.9200.16384 | Windows 8, Phone 8, Windows Server 2012 | 26 ottobre 2012 |
| DirectX 11.2 | 6.03.9600.16384 | Windows 8, RT, Windows Server 2012 R2 | |
| DirectX 12 | 10.00.10240 | Windows 10, Windows 10 Mobile, Windows Server 2016, Windows 11 | 29 luglio 2015 |

## Compatibilità

I costruttori hardware devono scrivere i driver per ogni componente e testarli per renderli compatibili con DirectX. Molte moderne periferiche hardware hanno driver compatibili solo con DirectX (in altre parole, si è obbligati ad installare DirectX prima di poter utilizzare quell'hardware). Le prime versioni di DirectX includevano una libreria aggiornata di tutti i driver compatibili disponibili fino a quel momento. Questo comportamento è stato interrotto a favore dell'aggiornamento automatico fatto con Windows Update, che permette agli utenti di scaricare solo i driver relativi al proprio hardware, piuttosto che l'intera libreria.
Alcuni driver supportano solo una versione di DirectX. Ma DirectX è backward compatible (compatibile col passato), il che significa che le nuove versioni supportano le più vecchie. Per esempio, se si ha installato DirectX 9 su un sistema e si esegue un gioco scritto per DirectX 6, dovrebbe funzionare comunque. Il gioco userà quella che è nota come "interfaccia" DirectX 6. Ogni nuova versione di DirectX deve supportare qualsiasi versione precedente.