DirectX

Da Wikipedia, l'enciclopedia libera.
DirectX
Logo
Microsoft-DirectX-Logo-wordmark.svg
Sviluppatore Microsoft Corporation
Sistema operativo Microsoft Windows
Genere Framework (non in lista)
Licenza EULA
(Licenza chiusa)
Sito web Home Page DirectX

DirectX (in origine chiamato "Game SDK") è una collezione di API per lo sviluppo semplificato di videogiochi per Windows. Il kit di sviluppo (SDK) è disponibile gratuitamente sul sito della Microsoft. Le DirectX venivano distribuite dai produttori di giochi stessi assieme al videogioco, ma sono anche incluse direttamente nel sistema operativo. La 9.0c è la versione delle librerie presente in Windows XP e precedenti, mentre in Windows Vista e in 7 e 8 la versione attuale è la 11 (in Windows 7 e in Windows 8 è inclusa mentre su Vista può essere inserita tramite aggiornamenti specifici).

DirectX API[modifica | modifica sorgente]

I vari componenti delle librerie DirectX sono disponibili al programmatore come oggetti corrispondenti alle specifiche COM.

I componenti compresi in DirectX 9.0c sono:

  1. 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à.
  2. 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.
  3. 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.
  4. 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. Tre gli effetti ci sono il volume, l'equalizzazione, il panning, il riverbero, la distorsione, vari effetti tridimensionali e la simulazione dell'effetto Doppler.
  5. DirectMusic: supporta la riproduzione di musica (MIDI, ma non MP3). Offre la funzionalità di un sintetizzatore software all'occorrenza.
  6. DirectShow: gestisce diversi file multimediali (per esempio filmati MPEG o audio MP3) e supporta lo streaming via Internet.
  7. DirectSetup: permette al programmatore di rivelare le DirectX installate e aggiornarne i componenti durante l'installazione del proprio programma.
  8. DirectX Media Objects: permette la modifica di streams audio e video, così da poterli poi riprodurre tramite DirectShow o DirectSound.

Storia[modifica | modifica sorgente]

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 rilasciare 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 dal rilascio. 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 rilasciata 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), 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.

Nel 2002, Microsoft ha rilasciato 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 rilasciando le funzioni di shader model 3.0 in DirectX 9.0c nell'agosto 2004.

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

Versione DirectX Numero di versione Sistema operativo Data di rilascio
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
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 rilasciato  
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
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
4.07.00.0700 Windows 2000 17 febbraio 2000
DirectX 7.0a 4.07.00.0716 (RC0)   8 marzo 2000
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
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  
4.09.00.0904 (RC0)   4 agosto 2004
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
6.00.6000.00000 Edizione modificata per Windows XP da KM-Software 4 dicembre 2007
6.00.6001.18000 Service Pack 1 per Windows Vista, 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 Windows Server 2008 SP2, attraverso l'aggiornamento Aggiornamento della Piattaforma per Windows Vista e un ulteriore aggiornamento da Windows Update, Windows 7 & Windows Server 2008 R2 27 ottobre 2009
DirectX 11.1 6.02.9200.16384 Windows 8, Windows Phone 8, Windows Server 2012 26 ottobre 2012
DirectX 11.2 6.03.9600.16384 Windows 8.1, Windows RT, Windows Server 2012 R2

Compatibilità[modifica | modifica sorgente]

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 versione di DirectX deve supportare ogni precedente versione.

Cambiamenti in DirectX10[modifica | modifica sorgente]

Architettura della 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[modifica | modifica sorgente]

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 correlata 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[modifica | modifica sorgente]

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[modifica | modifica sorgente]

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

   if(FAILED(device->TestCooperativeLevel())
     device->Reset(&d3dpp);

Dove d3dpp è una struttura che contiene vari settaggi del device (dimensioni del backbuffer, finestra su cui disegnare...)

Inoltre la funzione TestCooperativeLevel è stata sostituita dalla funzione CheckDeviceState che restituisce molte più informazioni rispetto alla precedente.

Geometry Shaders[modifica | modifica sorgente]

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.

Un altro strumento su cui la Microsoft sta lavorando è XNA, un framework al fine di assistere lo sviluppo di videogiochi integrando le DirectX, gli shader in linguaggio di alto livello (HLSL) e altro su diverse piattaforme. In tal modo la conversione tra un sistema XNA ed un altro sarà notevolmente più facile, rendendo il porting da Xbox a PC (e viceversa) molto più facile.

Voci correlate[modifica | modifica sorgente]

Altri progetti[modifica | modifica sorgente]

Collegamenti esterni[modifica | modifica sorgente]

microsoft Portale Microsoft: accedi alle voci di Wikipedia che trattano di microsoft