Corso di “Elementi di grafica digitale” Prof. Matjaz Hmeliak di: Andrea Zorzin Anno accademico 2006/2007 DirectX componenti: DirectX (in origine chiamato "Game SDK") è una collezione di API per lo sviluppo semplificato di videogiochi per Windows. La 9.0c è la versione attuale delle librerie in Windows XP e precedenti, mentre in Windows Vista la versione attuale è la 10. Principali componenti di DirectX 9.0c sono: 1. DirectX Graphics: permette la presentazione a video di grafica 2D e 3D, interfacciandosi direttamente con la scheda video. È composto da una API di basso livello (Direct3D) ed una di alto livello (Direct3DX). • Direct3D è concepito per applicazioni grafiche complesse e che richiedono un'alta frequenza di aggiornamento dello schermo. • Direct3DX si basa su Direct3D per offrire potenzialità simili con minore complessità (ausiliaria). • DirectX Graphics 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). 2 Componenti (2)... 2. DirectInput: gestisce l'input dato dalla tastiera, dal mouse, dal joystick o da qualsiasi altra periferica di gioco 3. DirectPlay: fornisce supporto ai giochi di rete. (non più supportato perché pesante). 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). 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. 3 Cambiamenti in DirectX10 DirectX10 ha introdotto grossi cambiamenti che rivoluzioneranno il modo di scrivere applicazioni RealTime, ad esempio: • Rimozione completa della fixed pipeline • Cambiamenti in D3DX • Lost Device automatico 4 Rimozione della Fixed Pipeline In DirectX10 c’è una filosofia diversa nell'utilizzo di Device. Non ci sono più le tipiche funzioni per agire via device sul rendering, in DirectX9 qualsiasi cosa (una texture, una vertex buffer o altro) deve e può essere creato soltanto tramite il device. Supponiamo device sia 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 5 Esempio shader float4x4 ModelViewMatrix; struct a2v { float4 Position : POSITION; float4 Color : COLOR0; }; struct v2p { float4 Position : POSITION; float4 Color : COLOR0; }; void main( in a2v IN, out v2p OUT ) { OUT.Position = mul(IN.Position, ModelViewMatrix); OUT.Color = IN.Color; } Gli shader devono riprodurre il comportamento fisico del materiale che compone l'oggetto cui sono applicati. Si può quindi creare uno shader per i metalli, uno per la plastica, uno per il vetro e così via, e riutilizzarli più volte all'interno di una scena. Una volta modellato un oggetto complesso, come può essere ad esempio una finestra, si assocerà al modello della cornice uno shader per il legno, uno per la maniglia e uno per il vetro. 6 Altri cambiamenti Cambiamenti in D3DX Molte funzioni e classi sugli shader (D3DXCompileShaderFromFile, D3DXAssembleShaderFromFile) sono state passate da D3DX a D3D, cioè sono passate dalla libreria ausiliaria a quella principale. Questo sottolinea l’importanza degli shader in DX10. Sono state completamente rimosse varie classi per la gestione delle animazioni (ID3DXAllocateHiearchy,D3DXMeshContainer, D3DXFrame), da questo si può facilmente intuire che sarà disponiblie un nuovo sistema di animazioni. Lost Device automatico Direct3D10 sarà 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. Geometry Shaders Un ulteriore aggiunta a DX10 sono i Geometry Shaders, essi sono un evolizione dei vertical shader. Un altro strumento su cui la Microsoft sta lavorando è XNA, un framework con lo scopo di assistere lo sviluppo di videogiochi integrando le direct, gli shader in linguaggio di alto livello (HLSL) e altro su diverse piattaforme. 7 Esempio di Geometry Shaders Normal mapping (Direct3D 9) dalla presentazione Microsoft WinHAC06 8 Esempio di Geometry Shaders (2) Displacement Mapping (Direct3D 10) dalla presentazione Microsoft WinHAC06 9 OpenGL OpenGL (Open Graphics Library) è una specifica che definisce una API per più linguaggi e per più piattaforme per scrivere applicazioni che producono computer grafica 2D e 3D. L'interfaccia consiste in circa 250 diverse chiamate di funzione che si possono usare per disegnare complesse scene tridimensionali a partire da semplici primitive. È usato per sviluppare nell'industria dei videogiochi (nella quale compete con DirectX su Microsoft Windows), per applicazioni di CAD, realtà virtuale, e CAE. È lo standard di fatto per la computer grafica 3D in ambiente Unix. OpenGL assolve a due compiti fondamentali: 1. nascondere la complessità di interfacciamento con acceleratori 3D differenti, offrendo al programmatore una API unica ed uniforme; 2. nascondere le capacità offerte dai diversi acceleratori 3D, richiedendo che tutte le implementazioni supportino completamente l'insieme di funzioni OpenGL, ricorrendo ad un'emulazione software se necessario. 10 OpenGL (2) OpenGL è una API procedurale che opera a basso livello, che richiede al programmatore i passi precisi per disegnare una scena. Questo approccio si pone in contrasto con le API descrittive ad alto livello le quali operano su struttura dati ad albero (scene graph). La natura di OpenGL obbliga quindi i programmatori ad avere una buona conoscenza della pipeline grafica stessa, ma al contempo lascia una certa libertà per implementare complessi algoritmi di rendering. Storicamente, OpenGL ha esercitato una notevole influenza sullo sviluppo degli acceleratori 3D, promuovendo: punti, linee e poligoni disegnati come primitive base; una pipeline per il transform and lighting; Z-buffering Texture mapping Alpha blending Una delle caratteristiche più apprezzate in ambito professionale è la retrocompatibilità tra le diverse versioni di OpenGL. 11 Generazione di chipset a confronto: • R100 - introdotto nel 2000, ATI introdusse il supporto alle liberie DirectX 7 e OpenGL 1.3. Con la tecnologia HyperZ ATI ottenne un incremento nel bandwidth e nel fillrate. • R200 - Il secondo chip di ATI introdusse DirectX 8.1 e OpenGL 1.4, progettato con tecnologia a shader programmabili, supportava il pixel shader 1.4, il più flessibile prima dell'introduzione del 2.0. • R300 - Rilasciato nel 2002, supportando le librerie DirectX 9 e OpenGL 2.0, rese ATI leader nel settore, grazie alla sua performance nel pixel shading. 12 Generazione di chipset a confronto: • R420 - Vennero aggiunte le funzioni delle DirectX 9.0b, tra cui il Shader model 2b. • R520 - Lanciata nell'ottobre 2005, supporta il Shader Model 3.0, oltre che la tecnologia di rendering a virgola mobile per l'applicazione di effetti High dynamic range rendering e di Antialiasing. • R600 - Questa generazione è la prima di ATI con supporto alle DirectX 10, introdotte nel sistema operativo Microsoft Windows Vista, e ad utilizzare un'architettura a shader unificati. Il core grafico R600 è composto da 320 stream processors riuniti in matrici SIMD. La nuova linea è stata finalmente lanciata il 14 maggio 2007 (con sei mesi di ritardo rispetto ai piani dell'azienda). Include le schede HD2900 XT, HD2400 e HD2600 nel segmento desktop e HD2100, HD2300, HD2600 nel segmento notebook. 13 Generazione di chipset a confronto: • NV1 - La prima scheda video prodotta da NVIDIA. • RIVA 128 e RIVA 128ZX - Supporto per DirectX 5 e OpenGL 1; la prima scheda con supporto DirectX dell'azienda. • RIVA TNT e RIVA TNT2 - Supporto DirectX 6 e OpenGL 1; la serie che ha regalato il successo alla NVIDIA. • GeForce 256 - Supporto DirectX 7 e OpenGL 1, transform & lighting via hardware, introduce le DDR. • GeForce 2 - DirectX 7 e OpenGL 1 14 Generazione di chipset a confronto: • GeForce 3 - DirectX 8.0 e OpenGL 1.2, possiede un'architettura che permette di risparmiare banda verso la memoria. • GeForce 4 - DirectX 8.1 (tranne le MX), OpenGL 1.4 e una versione economica (MX) basata sulla GeForce 2. • GeForce FX - DirectX 9 e OpenGL 1.5. • GeForce 6 - DirectX 9.0c e OpenGL 2.0, offriva shader migliorati, consumi ridotti e supporto per la configurazione SLI. • GeForce 7 - DirectX 9.0c e OpenGL 2.0, supporto per WDDM, antialiasing TSAA e TMAA, SLI • GeForce 8 - DirectX 10 e OpenGL 2.0, architettura unificata per gli shader, anti-aliasing CSAA, tecnologia Quantum Effects per la gestione della fisica. 15 I perché di DirectX... DirectX permette di accelerare l'accesso all'hardware ed evitare i comuni canali di comunicazione di Windows in modo da incrementare sensibilmente le performance. Inoltre DirectX riveste due ruoli, quello di driver veloce e di API. Non è possibile dividere queste due funzioni. Ciò significa che un programma che sfrutta OpenGL non può appoggiarsi a DirectX per avere una via preferenziale verso la scheda video, infatti tale via è utilizzabile solamente se il canale viene aperto dalle API Direct3D (o DirectDraw) e se vengono utilizzate le routine grafiche proprie di tali API. Quando si utilizza OpenGL il compito di aggirare le normali procedure di Windows è affidato alle GL Extension del sistema operativo (WGL). 16 ...e quelli di OpenGL Il meccanismo di estensione di OpenGL è probabilmente il punto su cui è più intensa la disputa fra le due APIs. OpenGL include un meccanismo in cui qualsiasi driver può far conoscere le proprie estensioni all’API, introducendo così nuove funzionalità. Ciò permette che la nuova funzionalità sia esposta rapidamente, ma questo può creare confusione se diversi fornitori implementano estensioni simili con APIs diverse. Molte di queste estensioni sono standardizzate periodicamente dal consorzio di revisione dell’architettura di OpenGL ed alcuni entrano a far parte del core delle successive versioni di OpenGL. 17 Confronto fra Direct3D e OpenGL Mentre OpenGL può essere implementata su qualsiasi sistema operativo, DirectX è compatibile solo con sistemi Microsoft. L’azienda di Redmond definisce periodicamente le API riguardanti tale libreria mentre OpenGL viene implementata dal consorzio OpenGL Architectural Review Board (ARB). I meccanismi di diffusione delle API sono, per OpenGL, “Include e Librerie”; per DirectX oggetti COM. 18 Immagini a confronto Halo DirectX 9 DirectX 10 Crysis Quake 4 19 OpenVG (Open Vector Graphics) E’ uno standard API progettato da un gruppo di lavoro composto da diverse aziende del settore. OpenVG è stato progettato per grafica vettoriale 2D con hardware accelerato. Il suo scopo principale sono i telefoni cellulari, console come la PlayStation 3 e altri prodotti dell'elettronica di consumo per ottimizzare l'utilizzo di risorse nel disegno delle interfacce utente. In particolare permette di accelerare sequenze Flash o SVG. Il gruppo OpenVG fu formato il 6 luglio 2004, la prima bozza delle specifiche fu rilasciata alla fine del 2004, mentre la versione 1.0 fu rilasciata il primo agosto 2005. Finora non vi è alcuna implementazione open source, ma il 16 gennaio 2007, Zack Rusin ha annunciato dal suo blog l'inizio di una implementazione open source di OpenVG poggiata su QtOpenGL di Trolltech. Il motivo maggiore per questa scelta è da ricercarsi nelle presunte qualità e prestazioni di QtOpenGL che secondo gli sviluppatori surclasserebbe ogni altro framework di grafica vettoriale. 20 Fonti Wikipedia (http://it.wikipedia.org) OpenSkills (http://openskills.info) http://natonelbronx.wordpress.com www.xmission.com GPGPU (http://www.gpgpu.org) ecc… 21