02 InitializeGraphics

Nell' articolo precendente, ho parlato del loop principale di una applicazione Direct3D, sebbene non abbiamo accennato nulla di relativo al disegnare qualche oggetto sullo schermo. Lo faremo adesso, allora. :) A questo punto esaminiamo il codice di inizializzazione del sistema grafico. ;)

Ricordiamo il game loop:

using Microsoft.DirectX; using Microsoft.DirectX.Direct3D; namespace Craig.Samples.Direct3D { public class Game : System.Windows.Forms.Form { static void Main() { Game app = new Game(); app.InitializeGraphics(); app.Show(); while (app.Created) { app.Render(); Application.DoEvents(); } app.DisposeGraphics(); } } }

InitializeGraphics è ciò di cui trattremo in questa sede. Spezzerò il codice commentandolo passo passo:

private Device device; protected bool InitializeGraphics() { PresentParameters pres = new PresentParameters(); pres.Windowed = true; pres.SwapEffect = SwapEffect.Discard; device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, pres); return true; }

E' molto breve, ma contiene in sè qualcosa di molto importante. Per prima cosa, nota la dichiarazione di un campo privato alla nostra classe:

private Device device;

E' del tipo "Microsoft.DirectX.Direct3D.Device", esso è assolutamente fondamentale per operazioni in Direct3D. L'oggetto Device è l'oggetto che rappresenta la scheda grafica nel tuo sistema, e come tale è implicata in tutto quello che noi vogliamo fare nel nostro programma, dal disegnare forme all'aggiungere luci.

Per poter utilizzare questo device, abbiamo bisogno di creare un'istanza della classe Device usando il nuovo operatore C#.

device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, pres);

Il costruttore prende diversi argomenti. Non voglio scendere troppo in dettaglio in questa sede, perchè questo rappresenta solo l'introduzione di ciò che vedremo in seguito. In breve, quello che il codice sta dicendo è, “Dammi la rappresentazione della prima scheda grafica (zero) nel sistema, tutti i processi voglio siano fatti in hardware, fai un render in questa finestra, processa i vertici via software, e usa i "presentation parameters" che ho specificato in pres.”

Molto probabilmente userai gli stessi parametri finchè non farai qualcosa di più sofisticato. Come ho detto, non voglio scendere troppo in dettaglio, ma farò menzione di PresentParameters, dal momento che ne necessiti la creazione:

PresentParameters pres = new PresentParameters(); pres.Windowed = true; pres.SwapEffect = SwapEffect.Discard;

PresentParameters controlla molte cose riguardo a come creare un device. Qui abbiamo deciso di accettare molti parametri di default, ma andiamo a settare le proprietà Windowed and SwapEffect.

Settiamo Windowed a true per creare un'applicazione in finestra (e non a tutto schermo). Se lo settassimo a false, la nostra applicazione Direct3D eseguirebbe in full-screen. Nel mentre avremmo prestazioni migliori, ed è poi la via scelta nella maggior parte dei giochi, richiederebbe ulteriori impostazioni, ma anche questo lo vedremo in seguito.

L'altro paramentro, SwapEffect, controlla come Direct3D gestisce i back buffers. Per default, quando richiami il rendering di Direct3D, non significa che stai disegnando sullo schermo. Al contrario, stai disegnando su un buffer, che sarà copiato una volta che tutti i poligoni saranno disegnati su quel buffer. Questo metodo è molto più efficiente, specialmente quando consideri che disegnare sullo schermo implica lo scambio di informazioni tra la memoria del sistema e il bus della scheda video.

Specificando SwapEffect.Discard, stiamo dicendo che quando Direct3D ha copiato il backbuffer sulla scheda video, può fare quello che vuole sul buffer. Un'altra opzione sarebbe quella di far rimanere intatte le informazioni sul buffer, o scambiare il contenuto sullo schermo con il back buffer. Stiamo analizzando il problema in maniera semplice, perciò lasciar stare per il momento è la cosa migliore.

Una volta creato il Device, lo memorizziamo in una variabile privata così da poterla utilizzare successivamente.

Nel prossimo articolo, parleremo del metodo Render, e finalmente disegneremo qualcosa sullo schermo!