DirectX (in origine chiamato "Game SDK") è una raccolta 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.
Disponibili dal 1995, 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, che presenta una nuova API di basso livello molto efficiente.
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 lobject 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
device->SetTexture(EsempioTexture); //Immette la texture per il prossimo rendering device->SetRenderState(D3DRS_LIGHTENABLE,false) //Disattiva le luci
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