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
Scarica

Zorzin_OpenGLvsDirectX