Corso di DirectX

Disegno di oggetti in DirectX: il primo triangolo

 

Superato il primo ostacolo, siamo pronti a sfruttare le potenzialità delle DirectX per disegnare i nostri oggetti. Ma la strada è ancora lunga...
L’obbiettivo 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 un’ora 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 l’altro.

#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 è anch’essa 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