Home Page Home Page Articoli Introduzione a DirectX

Introduzione a DirectX

Introduzione al mondo DirectX , requisiti, tools necessari, configurazione dell’ambiente di sviluppo.
Autore: Stefano Cristiano Livello:
Prerequisiti
Darò per scontate alcune conoscenze di tipo matematico e più precisamente un po’ di Algebra Lineare (ci serve calcolo delle matrici ed un po’ di spazi vettoriali) e le basi della trigonometria. Sarebbe utile, ma non strettamente necessaria, conoscenza di Analisi Matematica. Consiglio quindi a tutti coloro che sanno di non possedere questi strumenti matematici di attivarsi per impadronirsene. La matematica nel campo della Computer Graphics non è mai troppa. Più matematica conoscete più saranno avanzate le applicazioni che potrete realizzare.

Per quanto riguarda il lato informatico invece si danno per scontate la conoscenza del linguaggio C++ e le basi della OOP (Object Oriented Programming) se non altro i concetti di classe, ereditarietà, metodi virtuali etc. Non sono richieste conoscenze di programmazione sotto Windows in generale (gestione finestre, messaggi, controlli etc.).

Un’ultima nota: purtroppo la materia affrontata in questo libro è nata storicamente all’estero ed usa moltissimi termini tecnici in lingua straniera. Sarebbe assolutamente privo di senso proporre improbabili traduzioni di termini esteri in italiano. Si useranno sempre i termini originali in lingua inglese. Essi saranno spiegati brevemente dove necessario ma quello che consiglio al lettore è cercare di seguire gruppi di discussione, mailing list e siti dedicati in inglese dato che la ritengo l’unica via valida per impadronirsi del linguaggio specifico.

A questo proposito volevo segnalare i famosissimi siti http://www.flipcode.com ">Flipcode, http://www.gamedev.net ">Gamedev.net, http://www.cfxweb.com ">CfxWeb, ma sopratutto la Mailing List Ufficiale delle DirectX e la GD Algorithm List, l’italianissimo it.comp.giochi.sviluppo, frequentato da diversi professionisti del settore (e dal sottoscritto).

Ricordate anche di visitare il sito developer della
http://www.nvidia.com ">Nvidia e della http://www.ati.com ">ATI; c’è un’enorme quantità di documenti molto interessanti e di sorgenti utilissimi che vi attende.


Tools – Compilatori
Grazie al cielo viviamo in un mondo dove non dobbiamo più scrivere il codice macchina in linguaggio binario, ma esiste chi lo fa per noi. Infatti il primo Tool (strumento) che dovrete procurarvi è un compilatore. L’unico problema deriva dal fatto che non è semplicissimo utilizzare DirectX con compilatori differenti da quelli prodotti da Microsoft che come sicuramente sapete è proprietaria della tecnologia suddetta. L’ambiente di sviluppo ideale è ovviamente il blasonato Visual C++ 6.0 ma esistono anche altri compilatori gratuiti liberamente scaricabili dalla rete. Con un po’ di fatica si riesce a convicere tali compilatori a funzionare con DirectX. Di tutti quanti ho scelto l’ambiente di sviluppo C++ Builder che è gratuito in alcune vecchie versioni che potete trovare sulla rete o sui cd di alcune riviste. Tutti gli esempi saranno compilabili sia tramite Visual C++ che tramite il C++ Builder ma durante la trattazione degli argomenti si assumerà che si stia usando il compilatore della Microsoft per semplicità.

Vi segnalo alcuni strumenti non necessari ma utilissimi nello sviluppo in generale (non solo per i videogiochi) con i due compilatori citati: http://www.wholetomato.com ">Visual Assist For VisualC++ e ClassExplorer Pro For C++ Builder 5th.
Il Visual Assist vi sarà di grandissimo aiuto nello sviluppo, esso estende le potenzialità della tecnologia intellisense del Visual C++
Il Visual Assist vi sarà di grandissimo aiuto nello sviluppo, esso estende le potenzialità della tecnologia intellisense del Visual C++


Tools – DirectX SDK
Il secondo strumento che ci serve è il DirectX SDK 8.1a della Microsoft, che trovate a questo indirizzo. http://www.microsoft.com/directx ">SDK. L’SDK è davvero ben fatto e curato in tutti i suoi aspetti. La documentazione è fantastica e consiglio a tutti di studiarla attentamente. Se provate a guardare il contenuto delle varie cartelle vi accorgerete che ci sono svariati esempi con tanto di codice sorgente allegato e diversi tools che risulteranno utilissimi nello sviluppo. Ci sono anche degli articoli molto interessanti sul sito.
Il sistema operativo ideale sul quale sviluppare in DirectX è il Windows 2000 oppure in Windows XP per questioni di stabilità del sistema.

Durante l’installazione di DirectX SDK dovrete necessariamente selezionare l’installazione del Debug Runtime.

Oltre all’SDK potrebbero risultare utili degli Extras presenti sempre sul sito che contengono dei plug-in per esportare modelli tridimensionali dai pacchetti di grafica più noti nel formato proprietario di DirectX. Questi plug-in sono accompagnati dal codice sorgente che potrete eventualmente modificare per esportare informazioni specifiche non presenti nel formato standard. Se avete già installato il Visual C++, il setup del DirectXSDK modificherà opportunamente i percorsi di inclusione dei file header e di libreria. Controllate che sia effettivamente così aprendo il Visual C++ e andando in Tools->Options->Directories e controllando che il percorso di inclusione e di libreria del DXSDK sia il primo della lista. Se ciò non fosse il VC++ userebbe gli header di vecchie versioni di DirectX, causando una miriade di errori durante la compilazione. Provate ad aprire uno qualsiasi degli esempi qui presenti (magari Codice\Ch1_Introduzione\CiaoDirectX\CiaoDirectX.dsw) e a compilarlo. Se non compila allora c’è qualche problema di configurazione. Cercate di capire cosa non funziona seguendo i consigli appena dati e sistematelo altrimenti sarete bloccati ancor prima di cominciare.

La finestra Opzioni di Visual C++ con le modifiche effettuate dall’installazione.
La finestra Opzioni di Visual C++ con le modifiche effettuate dall’installazione.



COM
La API che andremo ora a studiare è DirectXGraphics che è costituita (come tutte le altre) da una serie di oggetti COM e da una fantastica libreria di supporto chiamata D3DX.

COM è un acronimo che sta per Component Object Model ed è uno standard progettato da Microsoft per la scrittura di applicazioni a componenti. Seguendo le regole stabilite da COM si possono sviluppare componenti in un qualsiasi linguaggio ed usarli praticamente ovunque in qualsiasi altro linguaggio che supporti COM (su piattaforme windows però). Un componente è costituito da una struttura dati alla quale sono associate delle funzioni (chiamate metodi) che operano su di essa. Questi componenti implementano una o più Interfacce che potete pensare come una serie di classi astratte formate da metodi virtuali puri. E’ proprio in questo modo che gli oggetti COM vengono presentati al C++: se aprite i file di header del DXSDK vi accorgerete che sono presenti solo classi astratte. In DirectXGraphics infatti su usa solo una funzione (Direct3DCreate8) per inizializzare il primo componente e tutti gli altri si ottengono tramite chiamate ad altri oggetti COM.

Abbiamo capito come si crea un oggetto COM ma come si fa a distruggerlo? Dimenticatevi di usare l’operatore delete del C++ per eliminare un oggetto COM poiché si utilizza una tecnica chiamata Reference Counting. Il Reference Counting stabilisce una regola alla quale devono aderire tutti gli oggetti COM e tutti i client che li utlizzano. Quando salviamo un puntatore ad un oggetto COM dobbiamo chiamare il suo metodo AddRef(), quando non ci serve più dobbiamo chiamare Release(). Questi due metodi gli permettono di essere condiviso da più parti o addirittura da più thread (volendo anche tra più applicazioni) dello stesso programma. L’oggetto verrà eliminato fisicamente dalla memoria di sistema quando nessun altro fa riferimento a lui. Questo sistema però può essere facilmente aggirato non appena da qualche parte di programma ci dimentichiamo di chiamare AddRef() o Release() quando opportuno. In questo modo l’oggetto potrebbe non venire più rilasciato causando un cosiddetto memory leak. Questo significa che l’oggetto non serve più a nessuno ma esso rimarrà in memoria occupando inutilmente spazio. E’ sempre possibile chiamare AddRef() e Release() perché TUTTI gli oggetti COM derivano da IUnknown definita come segue:

UINT AddRef()
Incrementa il Reference Count

UINT Release()
Decrementa il Reference Count

HRESULT QueryInterface(REFIID iid, void** result)
Chiede ad un oggetto COM se supporta una determinata interfaccia.


Quando il Reference Count di un oggetto raggiunge lo zero esso viene eliminato dalla memoria.

In generale non dovremo mai utilizzare QueryInterface per ottenere le interfacce DirectX poiché ci sono un sacco di funzioni di aiuto che lo fanno per noi.

Possiamo liberarci dal gravoso compito di chiamare sempre AddRef() e Release() utilizzando la comodissima classe CComPtr di ATL. ATL è una libreria Microsoft che facilita l’utilizzo di COM e che potete includere nelle vostre applicazioni includendo il file di header . Negli esempi saranno sempre usati questi smart pointers come sono definiti in gergo informatico. L’unica cosa alla quale bisogna stare attenti è usare la forma &ptr.p quando si ha bisogno di passare un puntatore a puntatore a oggetto COM. Per esempio la funzione CreateDevice() accetta tra i suoi parametri un puntatore a puntatore del tipo IDirect3DDevice**. Per esempio per creare il Device D3D che rappresenta il nostro acceleratore video dovete fare una cosa tipo:


#include

//Altre righe di codice...

typedef CComPtr Direct3D8_Ptr;
typedef CComPtr Direct3DDevice8_Ptr;
HWND g_hwnd;
Direct3D8_Ptr g_d3d;
Direct3DDevice8_Ptr g_device;
//Altre righe di codice....

HRESULT hr;

hr = g_d3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL, g_hwnd, 3DCREATE_SOFTWARE_VERTEXPROCESSING, &_params,&g_device.p);

if(FAILED(hr))
return -1;


In questo caso l’ultimo parametro è usa la tecnica descritta.

Ogni metodo di un oggetto COM restituisce un valore DWORD di tipo HRESULT. Questo valore indica se l’operazione richiesta è stata portata a termine oppure è fallita e in tal caso da alcune informazioni sull’errore. HRESULT è sostanzialmente un codice d’errore. Per vedere se è fallita la chiamata ad un metodo COM basta usare la demo FAILED come nel codice riportato di sopra

COM in realtà è una tecnologia molto complessa, ma questo è tutto quello che ci serve sapere su di essa per poter felicemente sviluppare in DirectX.
Voto medio articolo: 1.5 Numero Voti: 29
Stefano Cristiano

Stefano Cristiano

3D Coder. Sto lavorando ad un engine chiamato "Muse Engine" di cui potete leggere al mio sito http://pagghiu.gameprog.it Profilo completo

Articoli collegati

Integrare le Direct3D 8.1 con MFC Usando Visual Studio 6.0
In questo articolo mostreremo come creare una semplice applicazione SDI (Single Document Interface), in cui mostrare un oggetto tridimensionale in formato *.X e di farlo ruotare intorno all'asse Y.
Autore: Biagio Iannuzzi | Difficoltà:
Particle System
Brevi cenni su come implementare un particle system in DirectX
Autore: Stefano Cristiano | Difficoltà: | Voto:
Texture Blending (Parte II) Quake 3 Arena Shader System
Questo articolo è simile alla Parte I e ripete molti aspetti però tratta anche un pò degli shaders di Quake 3 Arena.
Autore: Stefano Cristiano | Difficoltà: | Voto:
Texture Blending (Parte I)
Come gestire gli effetti di blending tra texture. Multitexturing e Multipassing. Effect Files
Autore: Stefano Cristiano | Difficoltà: | Voto:
Sprite
Come creare uno "sprite" e animarlo. Special thanks to Elevator2 per gli sprites di megaman
Autore: Stefano Cristiano | Difficoltà: | Voto:
Texture
Introduzione al concetto di texture, di coordinate texture. Come animare le coordinate texture
Autore: Stefano Cristiano | Difficoltà:
Grafica 2D in DirectX. Vertex Buffers
Introduzione alla grafica 2D. Utilizzo dei vertex buffers
Autore: Stefano Cristiano | Difficoltà: | Voto:
Debbugging di applicazioni DirectX
Consigli e strategie per il Debugging delle applicazioni DirectX.
Autore: Stefano Cristiano | Difficoltà: | Voto:
Framework DXGWrapper
Spiega la filosofia di fondo del framework ideato dal sottoscritto ed usato da tutti i samples degli articoli relativi a DirectX.
Autore: Stefano Cristiano | Difficoltà: | Voto:
Gamma Correction e Colori
Una trattazione breve ma con una base matematica che spiega in parole povere il problema del fattore gamma e i colori in generale
Autore: Stefano Cristiano | Difficoltà: | Voto:
Inizializzazione e schermo
Si parla dell'inizializzazione dello schermo e delle modalità video in DirectX e di come gestire gli eventi "lost device", come scrivere un Game Loop e alcune info sul VSYNC
Autore: Stefano Cristiano | Difficoltà: | Commenti: 1 | Voto:
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5