Superato il primo ostacolo, siamo pronti a sfruttare le potenzialità
delle DirectX per disegnare i nostri oggetti. Ma la strada è ancora
lunga...
Lobbiettivo di questa lezione è semplice: far apparire un
triangolo nella nostra finestra.
Perché sempre triangoli?
I triangoli sono il poligono fondamentale della grafica 3D: ogni
triangolo è composto da tre vertici, e più triangoli vanno a formare
poligoni ed oggetti più complicati. Il motivo è che la forma del
triangolo rende più semplici i calcoli di illuminazione, intersezione,
visibilità ecc. che le schede grafiche devono compiere, prima di
disegnare sullo schermo.
Per questo motivo, tutti gli oggetti 3D vengono costruiti
a partire da triangoli (oppure vengono scomposti in triangoli a
partire da forme più complicate).
Ma un triangolo è semplice, vero?
Magari... In realtà, far disegnare un singolo triangolo alle DirectX
comporta un bel po di codice in più rispetto al nostro esempio
precedente. E una conseguenza diretta della loro potenza:
tra disegnare 1 oppure 100.000 triangoli cè poca differenza,
e appena fatto il primo potremo aggiungerne a volontà. Però il primo
ce lo dobbiamo sudare....
Potete trovare il codice completo di questa lezione (e delle prossime
due) in questo archivio zip.
Le definizioni necessarie
Per prima cosa, aggiungeremo in cima al nostro programma una serie
di definizioni e dichiarazioni:
LPDIRECT3DVERTEXBUFFER8
g_pVB = NULL;
Il tipo LPDIRECT3DVERTEXBUFFER8 è un puntatore ad un
buffer di vertici Direct3D versione 8 (come vedete i nomi sono molto
esplicativi. Per contro, ci vuole unora per scriverli). Questa
riga definisce un puntatore ad un vertex buffer.
Un vertex buffer è, appunto, un buffer destinato a contenere i dati
relativi ad uno o più vertici. A partire da questi vertici verranno
costruiti i triangoli dei nostri oggetti.
E possibile organizzare i vertici di un vertex buffer in vari
modi. Noi, poiché abbiamo un solo triangolo da far vedere, useremo
il più semplice: i tre vertici del triangolo uno dopo laltro.
#define D3DFVF_MIOVERTICE
(D3DFVF_XYZ | D3DFVF_DIFFUSE)
Qui definiamo un nuovo tipo di vertice: il nostro.
La definizione dei nostri tipi di vertici va fatta a partire da
quelli basilari forniti dal Direct3D: qui utilizziamo i tipi D3DFVF_XYZ
e D3DFVF_DIFFUSE, per indicare che i nostri vertici hanno 3 coordinate
spaziali e un colore diffuso. Questa definizione è molto importante,
perché dice al Direct3D come interpretare i numeri che metteremo
dentro al vertex buffer.
Ci sono altri tipi basilari di vertice oltre a questi due (dopotutto,
D3DFVD sta per Direct3D Flexible Vertex Format), che vedremo nelle
prossime lezioni.
struct MIOVERTICE
{
FLOAT x, y, z; // Posizione 3D del vertice
DWORD color; // Colore del vertice
};
La definizione del tipo di vertice non basta: occorre anche prevedere
uno spazio dove metterli. Per far questo, definiamo una struttura
MIOVERTICE, deputata a contenere un vertice tutto intero. Notate
come gli elementi della struttura seguano da vicino la definizione
del tipo di vertice: 3 coordinate spaziali (obbligatoriamente float)
e un colore (obbligatoriamente dword, o comunque un intero
da 4 bytes). Questi elementi devono essere gli stessi, e nello stesso
ordine, di D3DFVF_MIOVERTICE, altrimenti non funzionerà nulla.
Adesso possiamo finalmente inserire i vertici veri e propri: lo
facciamo tramite un array di strutture MIOVERTICE:
#define COLORE_ROSSO
0xFFFF0000
#define COLORE_VERDE 0xFF00FF00
#define COLORE_BLU 0xFF0000FF
#define COLORE_BIANCO 0xFFFFFFFF
#define COLORE_NERO 0xFF000000
CUSTOMVERTEX Vertices[]
=
{
{ -1.0f,-1.0f, 0.0f, COLORE_ROSSO, },
{ 1.0f,-1.0f, 0.0f, COLORE_BLU, },
{ 0.0f, 1.0f, 0.0f, COLORE_BIANCO, },
};
Ho definito prima un po di colori in formato RGB, per facilitare
le cose. Come vedete, ogni vertice ha le sue 3 coordinate spaziali
float (comprese tra 1.0 e 1.0), e un colore. Poiché la finestra
visibile Direct3D è anchessa compresa, per default, tra 1.0
e 1.0, questo è un triangolo che riempirà tutto lo schermo!
(segue nella prossima lezione...)
Torna all'indice Generale del corso di Corso di DirectX di Software Planet