DirectX: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m ortografia
Nessun oggetto della modifica
 
(46 versioni intermedie di 37 utenti non mostrate)
Riga 1:
{{Software
|Nome = DirectX
|Sviluppatore = [[Microsoft Corporation]], [[Linux]]
|UltimaVersione =
|DataUltimaVersione =
|UltimaVersioneBeta =
|DataUltimaVersioneBeta =
|SistemaOperativo = [[windows]]
|Linguaggio =
|Genere = Framework
Riga 12:
|SoftwareLibero = no
|Lingua =
|SitoWeb = [httphttps://www.microsoft.com/downloads/it-it/download/details.aspx?FamilyIDid=2da43d38-db71-4c1b-bc6a-9b6652cd92a335 Home Page DirectX]
}}
 
'''DirectX''' (in origine chiamato "Game SDK") è una collezione di [[Application Programming Interface|API]] per lo sviluppo semplificato di [[videogiochi]] per [[Microsoft Windows|Windows]]. Il [[Software development kit|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. In [[Windows XP]] è presente la versione 9.0c delle librerie, in [[Windows Vista]] è possibile inserire la versione 11 con specifici aggiornamenti, in Windows 7 e 8 la versione 11 è già inclusa, mentre in Windows 10 è già presente la versione 12.
'''DirectX''' (in origine chiamato "Game SDK") è una collezione di [[Application Programming Interface|API]] per lo sviluppo semplificato di [[videogiochi]] per sistema operativo [[Microsoft Windows]]. Il [[Software development kit|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 [[Windows 8|8]] la versione 11 è già inclusa, mentre in [[Windows 10]] e in [[Windows 11]] è già presente la versione 12 anche per Linux.
 
== DirectX API ==
Line 20 ⟶ 21:
 
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]].<br />Permette al programmatore di sfruttare direttamente le potenzialità dell'hardware del PC, eludendo [[Graphics Device Interface|Graphics Device Interface (GDI)]] e [[Display Device Interface|Display Device Interface (DDI)]] di Windows. Le funzioni non supportate dall'hardware vengono emulate via software dalle DirectX grazie al [[Hardware Emulation Layer|Hardware Emulation Layer (HEL)]].<br />È 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 [[Videogioco|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 (informatica)|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 (informatica)|digitale]]. Supporta gli effetti di [[Force Feedback]].
# '''DirectPlay''': fornisce supporto ai giochi di rete. Consiste principalmente in un [[Protocollo di rete|protocollo]] a livello "applicazione" (vedi il [[Open Systems Interconnection|modello OSI]]) che gestisce oggetti logici quali la ''Sessione'' di gioco e i ''Giocatori'' (differenziati in remoti e locali).<br />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 (reti)|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).<br />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. TreTra gli effetti ci sono il volume, l'[[equalizzazione]], il ''panning'', il [[riverbero]], la [[distorsione (fisica)|distorsione]], vari effetti tridimensionali e la simulazione dell'[[effetto Doppler]].
# '''DirectMusic''': supporta la riproduzione di musica ([[Musical Instrument Digital Interface|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]].
Line 37 ⟶ 38:
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, [[MS-DOS|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 [[Windows API|Win32]] che avrebbe sostituito l'API insufficiente e nata male per il [[sistema operativo]] [[Windows API|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 [[Computer-aided design|CAD]]. Direct3D avrebbe dovuto essere un piccolo aiuto per OpenGL orientato ai giochi. Con la crescita della potenza delle [[scheda video|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 [[Videogioco|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 (videogiochi)|console]] [[Xbox]] della Microsoft. L'API è stata sviluppata in collaborazione tra Microsoft e [[NVIDIA Corporation|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 shading|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 ===
Con la versione 8 sono stati introdotti i wrapper per [[Microsoft .NET|.Net framework]] in modo da poter sviluppare direttamente con questa piattaforma.
[[File:D3D Pipeline.svg|thumb|upright=1.4|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 ====
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 ====
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, 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|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 [[Advanced Micro Devices|AMD]] con [[Mantle]], Apple con [[Metal (API)|Metal]] e dal [[Khronos Group]] con [[Vulkan (API)|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 series|GeForce 20]].<ref>https://www.nvidia.com/en-us/geforce/news/geforce-gtx-ray-tracing-coming-soon/</ref>
 
=== Cronologia versioni ===
{| class="wikitable"
|- style="background: #ececec;"
Line 92 ⟶ 157:
|4.07.00.0716&nbsp;(RC1)||&nbsp;||[[2000]]
|-
|DirectX 7.1||4.07.01.3000||Esclusiva [[Windows MEMe]]||14 settembre [[1999]]
|-
|DirectX 8.0||4.08.00.0400&nbsp;(RC10)||&nbsp;||12 novembre [[2000]]
Line 120 ⟶ 185:
|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&nbsp;(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]]
|-
|rowspan="3"|DirectX 10 || 6.00.6000.16386 || Esclusiva di [[Windows Vista]] || 30 novembre 2006
Line 130 ⟶ 195:
|| 4 febbraio 2008
|-
|rowspan="1"|DirectX 11 || 6.01.7600.16385 || [[Windows Vista#Service Pack 2|Windows Vista SP2]] e [[Windows Server 2008#Service Pack 2|Server 2008 SP2]], attraverso l'aggiornamento [httphttps://support.microsoft.com/kb/971644/ Aggiornamento della Piattaforma per Windows Vista] e un ulteriore aggiornamento da Windows Update, [[Windows 7|7]] e [[Windows Server 2008 R2|Server 2008 R2]] || 27 ottobre 2009
|-
|rowspan="1"|DirectX 11.1 || 6.02.9200.16384 || [[Windows 8]], [[Windows Phone 8|Phone 8]], [[Windows Server 2012|Server 2012]] || 26 ottobre 2012
|-
|DirectX 11.2 || 6.03.9600.16384
|| [[Windows 8]], [[Windows RT|RT]], [[Windows Server 2012 R2|Server 2012 R2]] ||
|-
|rowspan="1"|DirectX 12 || 10.00.10240 || [[Windows 10]], [[Windows 10 Mobile]], [[Windows Server 2015|Server2016]], [[Windows 201511]] || 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 ogni precedentequalsiasi versione precedente.
 
== Cambiamenti in DirectX10 ==
[[File:D3D Pipeline.svg|upright=1.4|thumb|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 ===
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 ===
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
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 ===
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.
 
== Note ==
Un altro strumento su cui la [[Microsoft]] sta lavorando è [[Microsoft XNA|XNA]], un [[framework]] al fine di assistere lo sviluppo di [[Videogioco|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.
<references/>
 
== Voci correlate ==
* [[Lista di videogiochi con supporto DirectX 10]]
* [[Lista di videogiochi con supporto DirectX 11]]
* [[Managed DirectX]]
* [[DirectShow]]
Line 204 ⟶ 219:
 
== Altri progetti ==
{{interprogetto|commons=Category:DirectX}}
 
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* {{en}} [http://msdn.microsoft.com/directx Pagina ufficiale di DirectX su Microsoft] - (D3D SDK Download Page)
* {{FOLDOC}}
* {{cita web|http://directxworld.altervista.org|DirectX World - Sviluppo Engine3D per videogiochi|lingua=en}}
* {{en}} [https://msdn.microsoft.com/directx Pagina ufficiale di DirectX su Microsoft] - (D3D SDK Download Page)
* {{cita web|http://www.gamedev.net|Sito generale riguardo al game development|lingua=en}}
* {{cita web|1=http://directxworld.altervista.org|2=DirectX World - Sviluppo Engine3D per videogiochi|lingua=en|accesso=28 agosto 2018|urlarchivio=https://web.archive.org/web/20170205021949/http://directxworld.altervista.org/|dataarchivio=5 febbraio 2017|urlmorto=sì}}
* {{cita web|url=http://www.tomshw.it/graphic.php?guide=200611081|titolo=Analisi DirectX 10: cosa ci riserva il futuro?}}
* {{cita web|https://www.gamedev.net/|Sito generale riguardo al game development|lingua=en}}
* {{cita web|url=http://www.tomshw.it/graphic.php?guide=200611081|titolo=Analisi DirectX 10: cosa ci riserva il futuro?|accesso=16 luglio 2007|urlarchivio=https://web.archive.org/web/20070927064741/http://www.tomshw.it/graphic.php?guide=200611081|dataarchivio=27 settembre 2007|urlmorto=sì}}
* {{cita web|http://www.bitsandchips.it/gaming/6-directx-111-un-primo-sguardo|Un primo sguardo alle DirectX 11.1}}