In questo capitolo iniziamo ad occuparci di rendering 3D. Per rendering si intendono i processi attraverso i quali si passa da un modello 3D ad un'immagine, ossia dalla sua "rappresentazione astratta" fino allo schermo.
Sebbene esistano diverse tecniche per il rendering di oggetti tridimensionali (ray tracing, radiosity, photon mapping, ecc.), gran parte dell'hardware moderno si avvale di tecniche di "rasterizzazione", basate cioè sulla proiezione della geometria del modello su una superficie a due dimensioni (in genere, il monitor del nostro computer o del nostro device). Per realizzare questo risultato, le tecniche di rasterizzazione scompongono una scena 3D, per quanto complessa e articolata, in una collezione di triangoli che poi vengono successivamente riempiti e colorati nel modo più appropriato.
Per poter funzionare correttamente, il rendering 3D richiede (oltre a una scena da disegnare) che sia definito un sistema di riferimento per descrivere:
- la posizione di un oggetto nel "mondo"
- la collocazione e l'orientamento dell'osservatore o, se si preferisce, della telecamera che inquadra la scena
Infine, è necessario che siano definite delle funzioni di traformazione che consentano di passare dal mondo tridimensionale a quello piatto dello schermo, "trasportando" le coordinate in tre dimensioni dei vertici che compongono la scena in uno spazio bidimensionale; questo importantissimo passaggio è compito dei cosiddetti shaders.
Vediamo adesso ciascuno di questi aspetti più nel dettaglio.
Scena 3D
Come si è detto, una scena 3D può essere vista come un insieme di triangoli (o, al massimo, di punti e linee) con delle texture applicate sopra. L'uso delle texture applicate a un oggetto 3D comporta il notevole vantaggio che i dettagli molto piccoli possono essere rappresentati, anziché mediante singole variazioni nella geometria, semplicemente "disegnandoli" sulla geometria stessa.
Immaginiamo di avere un muro di mattoni: un conto è dover modellare la forma di ciascun singolo mattone (con le varie rientranze, crepe o irregolarità), un altro è invece poter disegnare la "trama" dei mattoni, con tutti i dettagli del caso, sopra un muro liscio (quindi un semplice rettangolo). Affinché tutti i mattoni risultino disegnati al posto giusto, una volta "scomposta" la geometria in triangoli dobbiamo associare a ciascun vertice una coppia di valori (le cosiddette "coordinate uv") che indicano a quale punto della texture quel vertice corrisponde. Grazie a questa indicazione, la texture può venire "inchiodata" ai vertici corretti e "spalmata" per ricoprire l'intera superficie.
Fortunatamente in XNA queste operazioni possono essere gestite dallo SpirteBatch in modo pressoché automatico, visto che è quest'ultimo a incaricarsi per noi di tutte queste incombenze. In questo capitolo, in particolare, useremo lo SpriteBatch per sperimentare i nostri primi shader e giocare un po' con le matrici di trasformazione, vero fondamento di qualunque animazione 3D. Prima di tutto, però, cerchiamo di capire come i nostri triangoli arrivano ad essere disegnati a schermo.