02 InitializeGraphics

La dernière fois, j'ai parlé de la boucle principale pour une application Direct3D. Nous n'avons pourtant pas encore vu comment dessiner des choses sur l'écran. Bein cette fois-ci non plus ^^. Mais nous allons franchir un cap important en examinant le code d'initialisation nécessaire pour avoir une application Direct3D qui marche.

Souvenez vous de la boucle de jeu :

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(); } } }

C'est sur InitializeGraphics que nous allons nous attarder cette fois ci. Je vais vous montrer directement le code intéressant ici :

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; }

C'est assez court, mais y a des choses importantes ici. D'abord, remarquez l'ajout d'un membre à notre classe :

private Device device;

Il est de type Microsoft.DirectX.Direct3D.Device et c'est absolument vital pour toute application Direct3D. L'objet Device représente la carte graphique de votre système et est impliqué dans tout ce que nous avons besoin de faire, du dessin à l'ajout de lumières.

Afin d'utiliser le Device, nous avons besoin de l'instancier en utilisant l'operateur new du C#.

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

Le constructeur prend plusieurs arguments. Je ne veux pas trop entrer dans les details étant donné que ça impliquerait une introduction à des concepts avancés sur les cartes graphiques. En un mot, ce que le code dit est "Donne moi un représentant de la première (zeroième) carte graphique du système, je veux que le traitement soit fait par le matos, que le rendu se fasse dans cette fenêtre, que tu traites les sommets logiciellement, et que tu utilises les paramètres de présentation que j'ai fourni dans pres."

Vous allez certainement utiliser les mêmes paramètre jusqu'à ce que vous vous mettiez à une programmation Direct3D plus sophistiquée. Comme je vous l'ai dit, je ne veux pas trop fouiller dans ces paramètres, mais je vais détailler PresentParameters car vous aurez besoin d'en créer un vous-même :

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

PresentParameters contrôle pas mal de choses sur la façon dont le Device est créé. Ici nous avons décidé de garder la plupart des paramètres à leur valeur par défaut, mais nous avons reglé les propriétés Windowed et SwapEffect.

Mettre Windowed à vrai fera tourner notre application dans une fenêtre habituelle, comme n'importe quelle autre application. Si nous l'avions mis à faux, notre application Direct3D aurait tourné en plein-écran. Bien que cela ait de meilleures performances et que c'est comme ça que fonctionnent la majorité des jeux, cela demande d'avantage de configuration que nous nous épargnerons pour le moment.

L'autre paramètre, SwapEffect, définit comment Direct3D gère les Back Buffers. Par défaut, lorsque vous appelez des methodes de rendu de Direct3D, vous n'écrivez pas sur l'écran mais en fait sur un buffer (zone mémoire) qui sera copiée d'un bloc à l'écran une fois le dessin terminé. Ceci est la façon de faire la plus efficace, particulièrement lorsque vous savez que dessiner à l'écran demande un déplacement d'information de la mémoire centrale de l'ordinateur vers la carte graphique.

En spécifiant SwapEffect.Discard, nous déclarons à Direct3D que une fois le Back Buffer copié sur la carte graphique, il peut faire ce qu'il a envie avec le Back Buffer. D'autres options feraient en sorte que Direct3D garde le contenu du back buffer intacte ou qu'il fasse un échange avec ce qu'il y a à l'écran. Restons simples, donc Discard est bien.

Une fois que nous avons créé le Device, nous le stockons dans une variable membre que nous pourrons utiliser plus tard.

La prochaine fois, nous parlerons de la methode Render, et nous allons enfin dessiner quelquechose à l'écran!