DirectX 8 Graphics 1 : Prenière approche.

Pré-requis:

Installation de DirectX8 :
Vous pourrez trouver le SDK de DirectX 8 (8.1 en l'occurence) ici
Ensuite, il vous faut spécifier à Visual C++ les repertoire des fichier d'entête et des lib de DirectX. Pour cela allez dans le menu Outils (ou Tools) puis Option puis l'onglet Répertoire (ou Directory). En double clicant sur le carré blanc en dessous des repertoires, vous pouvez ajoutter un chemin de recherche. Faites les en-têtes (include) et les lib. Il faut utilisé les chemin $SDK DirectX8$\inc et $SDK DirectX8$\lib. On change de type de répertoire avec la list box "Montrer repertoire pour" ("Show directory for"), cf la capture ci-dessous:

Programme exemple:
Vous le trouverez ici.
Comme les 312 lignes de code sont relativement bien docummentées, on ne fera dans ce documment qu'une approche thérorique sous forme de FAQ (donc si vous avez des question additionnelles c'est )

1. C'est quoi un device ???
Un device est une représentation de votre carte vidéo, c'est l'interface via laquelle vous pourrez gérer le fonctionnement de votre GeForce3. Vous en avez autant que de carte vidéo, voire plus car de plus en plus de carte vidéo peuvent gérer 2 écrans.
L'objet Direct3D sert à voire les capacités de ces devices et de choisir celui (ou ceux qui vous conviennent). Une application ne doit créer qu'un seul objet Direct3D mais peut avoir plusieurs device.

2.Comment on créer un device ???
g_lpD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_lpDevice );
D3DADAPTER_DEFAULT pour dire qu'on veux le device principal de l'ordinateur .
D3DDEVTYPE_HAL pour spécifier que on veux utiliser la carte video.
g_hWn c'est le handle de la fenêtre dans laquelle on veux rendre.
D3DCREATE_SOFTWARE_VERTEXPROCESSING pour dire que c'est le processeur qui fera le Transform & Lightning, au moins ca tournera sur une simple TnT
d3dpp structure qui contient ce qu'on veux, résolution, plein écran, profondeur de couleurs ...
g_lpDevice interface de device qu'on aura en retour si tout ce passe bien.

3. C'est quoi un vertex ???
Un vertex (vertices au pluriel) représente un point dans l'espace. Il en faut 3 pour former un triangle.

4. C'est quoi cette histoire de FVF ???
La vie d'un vertex est longue avant qu'il ne représente un coordonné sur votre 17". Prenons un monde avec un vertex et une source de lumière. Au début de ce qu'on appele le pipeline de rendu, le vertex aura des coordonnées dans le monde 3D (il sera de la forme x,y,z) et ne sera pas éclairé. On va d'abord calculé sont éclairage ce qui lui rajoutte une composante qu'on appele le spéculaire (x, y, z, couleur). Ensuite on va le transformé pour exprimer la position sur votre moniteur, en x et y, z sera compris entre 0 et 1 et on rajoutte une composante rhw (réciproque homogène de w) qui est là à cause d'un histoire de matrice, peu importe. Ces opérations se nomment le Transform & Lightning.
En plus de cela, on peu donner une couleur de base au vertex (composante diffuse) et jusqu'a 8 texture. Ca en fait des possibilitées.
DirectX vous permet de choisir quel type de vertices vous comptez utilisé.

5. Vertex buffer quesako ???
Comme vous le savez sans doute, les cartes graphiques récentes sont capables de faire l'étape du Transform & lightning directement. On transmet donc les vertices à la carte 3D à chaque rendu. Malheuresement cette méthode n'est pas la plus rapide, puisque la carte 3D peut faire toutes les opérations sur les vertices, on a plus trop besoin d'accéder à ceux-ci, il est donc interressant de les stocker sur la carte graphique où la mémoire et bien plus rapide même contre de l'AGP x8. C'est pour cela que les vertex buffer sont là, il rendent transparent la localisation des données.
Comme il est fort probable qu'un vertex buffer soit sur la carte vidéo, donc non addressable, on le "locke" (vérouille) pour que DirectX le transfère dans la mémoire centrale où on pourra avoir un pointeur direct.

6. Heu je comprend pas la procédure de rendu ???
Alors étudions là en détail ligne par ligne:

g_lpDevice->Clear( 0, 0, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0x00,0x00,0xff), 0.0f, 0L);
Là on "nétoie la surface de rendu (D3DCLEAR_TARGET) en y mettant du bleu (D3DCOLOR_XRGB( 0x00,0x00,0xff) ), les 2 dernier paramêtre servent quand on veux nétoyer d'autre buffer. Les premiers paramêtres servent à définir les zonnes à nétoyer en mettant 0 et 0, on néttoie tout.

g_lpDevice->BeginScene();
Bon là pas de prob je pense on passe en mode de rendu c'est tout.

g_lpDevice->SetStreamSource( 0, g_lpVB, sizeof(VERTEX) );
Là on va dire à DirectX Le vertex buffer qu'on veut utiliser, on spécifie aussi sa taille. Le premier paramêtre est à mettre à 0 (c'est pour utiliser plusieurs vertex buffer en même temps).

g_lpDevice->SetVertexShader( D3DFVF_VERTEX );
La on stipule le type de vertices qu'on va rendre, dans notre cas, on dits qu'on prend un pipeline de "fixed function" en comparaison des vertex et pixel shader, qu'on spécifie aussi ici.

g_lpDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );
Enfin on rend notre primitive, on donne une liste de triangle (liste de 1 triangle), on veux commencer avec le premier vertex du buffer et on veux dessiner 1 primitive (dans ce cas un triangle).

g_lpDevice->Present(0, 0, 0, 0);
On affiche ce qu'on as déssiné, les paramêtre sont tous à 0 pour afficher tout le buffer (cas habituel).

6. On a quoi à la fin ???