APPRENTISSAGE DE DIRECTX 02

cs_jmhC Messages postés 108 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 10 août 2007 - 25 juin 2006 à 10:50
cubinou Messages postés 5 Date d'inscription dimanche 18 mai 2003 Statut Membre Dernière intervention 3 mai 2010 - 21 sept. 2006 à 23:27
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/38297-apprentissage-de-directx-02

cubinou Messages postés 5 Date d'inscription dimanche 18 mai 2003 Statut Membre Dernière intervention 3 mai 2010
21 sept. 2006 à 23:27
juste pour signaler que dans le programme il y a une faute de frappe, tu parle du fond d'ecran et non pas du font ;) je commencais a me perdre dans les lignes ;)
seb2086 Messages postés 96 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 1 février 2010
2 juil. 2006 à 11:12
Oui excusez moi tous j'ai dû faire une mauvaise manipulation mais ce n'est pas d3dx9dt.lib mais d3dx9.lib voila et la ca devrait fonctionner.
cs_jmhC Messages postés 108 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 10 août 2007
2 juil. 2006 à 11:04
Tu peux compiler en Release. Pour le Debug, il te faut cette lib.
gbourgeois0019 Messages postés 152 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 2 juin 2008 1
2 juil. 2006 à 04:18
Salut,

J'ai la derniere version de directx sdk et je n'ai pas d3dx9dt.lib et donc le prog ne compile pas ... c'est normal que je ne trouve pas cette librairie ??
seb2086 Messages postés 96 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 1 février 2010
28 juin 2006 à 10:08
Exact moi j'ai la version de décembre 2004 et un copain m'a dit qu'il y a eu une version en juin 2006 donc je pense que le problème vient de la
cali70 Messages postés 71 Date d'inscription mercredi 29 septembre 2004 Statut Membre Dernière intervention 19 mars 2008
27 juin 2006 à 12:35
J'ai installé le dernier sdk récemment et ta source ne compile pas car le compilo ne trouve pas une certaine librairie... j'imagine que c'est parce que tu n'as pas utilisé la derniere version (il y'a eu quelques petits changements entre la précédente version et la version actuelle). Dis moi ce qu'il en est si le probleme ne vient pas de ca j'en chercherai la cause.
seb2086 Messages postés 96 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 1 février 2010
27 juin 2006 à 08:14
Ouais désolé en fait c'est sous directx 9.0c et c'est la suite d'une autre source .
cali70 Messages postés 71 Date d'inscription mercredi 29 septembre 2004 Statut Membre Dernière intervention 19 mars 2008
27 juin 2006 à 00:04
LOL, je croyais que c'était ironique la remarque au début ;)
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
26 juin 2006 à 23:33
a ok, je me disait, le mec sort du cimetiere.
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
26 juin 2006 à 23:04
Mais non. C'est le "tuto" qui est le second. Il doit rouler sous Direct X 9.0c
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
26 juin 2006 à 20:46
Direct X 02 ?? arf, meme mon grand pere ne l'utilisait pas ^^
sinon sa a l'air interessant, je regarde.
seb2086 Messages postés 96 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 1 février 2010
26 juin 2006 à 16:52
Merci Cali70 pour ces précisions que je n'aurais jamais pu fournir aux personnes désirant une description détaillée de cette partie
cali70 Messages postés 71 Date d'inscription mercredi 29 septembre 2004 Statut Membre Dernière intervention 19 mars 2008
26 juin 2006 à 13:46
Salut! Je vais apporter quelques précisions à tout ca...
Déjà sur ce que demande SAKingdom.
d3dpp est ce k'on appelle le D3DPRESENT_PARAMETERS, c'est une structure définit comme ca:

typdef struct D3DPRESENT_PARAMETERS {
UINT BackBufferWidth;
UINT BackBufferHeight;
D3DFORMAT BackBufferFormat;
UINT BackBufferCount;
D3DMULTISAMPLE_TYPE MultiSampleType;
DWORD MultiSampleQuality;
D3DSWAPEFFECT SwapEffect;
HWND hDeviceWindow;
BOOL Windowed;
BOOL EnableAutoDepthStencil;
D3DFORMAT AutoDepthStencilFormat;
DWORD Flags;
UINT FullScreen_RefreshRateInHz;
UINT PresentationInterval;
}D3DPRESENT_PARAMETERS;

Cette strcuture spécifie les caractéristiques du device que l'on veux créer...
Les 2 premiers membres correspondent aux dimensions du backbuffer, je crois que tout le monde l'avait deviné. Ensuite, le BackBufferFormat, c le format de pixels utilisé par le device comme par exemple D3DFMT_A8R8G8B8 qui siginifie que l'ont a 8 bit pour l'alpha, 8 pour la composante rouge....

Le BackBufferCount c'est le nombre de Backbuffer, en général il n'y en a q'un seul mais on peut en trouver parfois 2, c'est le cas lorsque l'on implémente ce que l'on appelle le triple buffering. Le device peut supporter jusqu'à 4 back buffer.

Le MultiSampleType on peut le décrire brièvement comme l'antialiasing et la MultiSampleQuality ben ca définit la qualité... vous avez surement déjà vu dans les options des jeux des trucs du genre antialiasing 2X ou 4X, 6X.....et ben c'est ca et + la qulité est élevée + ca mange des ressources.

Le SwapEffect... il y'a 3 valeures possibles :
D3DSWAPEFFECT_FLIP : celà indique que lorsque l'on présente le back buffer au front buffer pouréffectué le rendu et bien les pointeurs des 2 buffers sont échangé l'un avec l'autre, c'est à dire que le pointeur du frontbuffer pointe sur le back buffer et inversement, c'est le mode le + rapide en full screen et à éviter en mode fenêtré car le hardware ne peut pas éffectuer cette manipulation et elle est donc émulée (donc ca bouffe + de mémoire et c'est + lent).

D3DSWAPEFFECT_COPY : Ici le contenu du back buffer est copié dans le front buffer, c'est la technique à utiliser en mode fenêtré pour les raisons que j'ai énnoncé + haut. Attention lorsque l'on éffectue une copie, le contenu du backbuffer n'est pas alteré et donc on peut avoir accès à son contenu même après avoir présenté le front buffer au back buffer (utile dans certains cas).

D3DSWAPEFFECT_DISCARD : C'est ce que tu as utilisé dans ta source et je dirais que c'est un bon choix car avec ce flag le device choisi tout seul quelle méthode utiliser (cad la meilleure par rapport à tes paramettres).

La hDeviceWindow: C'est la fenêtre liée au device en ce qui concerne le focus, si on laisse NULL le device serra attaché à la fenêtre employée lors de l'appelle à la fonction createdevice, c'est toujours le cas en mode fenêtré mais on peut très bien lui attacher une autre fenêtre en mode full screen, je ne vais pas trop m'éttendre sur ce sujet...

Le membre booléen Windowed sert à dire au device si l'affichage s'éffectue en mode fenêtré ou non... rien de particulier ici.

Le EnableAutoDepthStencil : Si on met true le device céera un z-buffer et un stencil buffer qui lui serront attaché automatiquement. Je pense que vous voyez un peu ce qu'est le z-buffer et sinon le stencil buffer est un buffer comme le z-buffer mais on peut l'utiliser pour éffectuer le rendu sur certaines parties uniquement du back buffer... et sert également pour certains effets comme les ombres, la réfléction sur une surface... là aussi je vais pas détailler les techniques c'est pas le sujet et c'est pas vraiment pour débutant.

Le AutoDepthStencilFormat : Si le membre précédent est vrai ceci contient le format de données des pixels du z et stencil buffers. C'est à dire le nombre de bit allouées a chaques pixels du z et stencil buffer. Par exemple : D3DFMT_D24S8 indique 24 bit pour le z buffer et 8 pour le stencil buffer.

Les Flags : Indiquent comment doivent être traiter le back buffer et le z buffer.

D3DPRESENTFLAG_LOCKABLE_BACKBUFFER : dans ce cas le device crée un backbuffer dont on peut modifier ou rapatier des données en y accèdant directement par la fonction Lock().

D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL : Ce flag donne les meilleures preformances lorsque l'on a crée un z buffer. Le contenu du z buffer n'est plus accessible après le rendu.

FullScreen_RefreshRateInHz : indique le taux de raffraichissement du device en hertz, 60....
pour utiliser le taux de rafraichissement par défaut du moniteur il suffit de mettre 0. En mettant D3DPRESENT_RATE_DEFAULT le device choisit tout seul.

Le PresentationInterval : Là c'est un peu plus délicat à expliquer mais je vais éssayer.
Lorsque le moniteur éffectue le rendu le canon à électron à l'intérieur balaie l'écran de haut en bas et de gauche à droite. Une fois qu'il est arrivé en bas il revient à sa position de départ en suivant une trajectoire diagonale du coin en bas à droite au coin en haut à gauche. Ce court laps de temps est appellé la vertical retrace periode. Maintenant... Imaginons que l'on éffectue le rendu pendant que le canon éffectue un rendu (une frame) et qu'il n'a pas finit de parcourir l'écran. Si on présente le back buffer au front buffer immédiatement et bien la partie de l'écran au dessus du canon affichera l'ancienne image (la précédente frame) et le canon commencera à afficher le contenu de la nouvelle image sur le reste de l'écran donc sur le même écran on aura une partie de l'ancienne image et une partie de la nouvelle. ce phénomene n'est pas visible à 60 images par secondes mais on peut distinguer facilement des artéfacts (des genres de lignes qui traversent l'écran quand vous bouger la camera, je suis sur que vous voyez de quoi je parle. Voilà, donc en mettant D3DPRESENT_INTERVAL_IMMEDIATE c'est ce qui ce produit.
Y'a t'il moyen d'éliminer ces artéfacts ? et bien oui, pour ca il suffit d'attendre la vertical retrace période, là où le canon n'éffectue aucun rendu pour présenter le back buffer au front buffer ainsi lorsque le canon commencera de nouveau à balayer l'écran il n'affichera plus que la nouvelle image qui est déjà présenté au front buffer et qui n'attend plus qu'à être rendu. Pour attendre la vertical retrace periode il faut mettre ce flag : D3DPRESENT_INTERVAL_ONE. Mais on peut aussi décider d'attendre une 2ieme perdiode de retrace pour éffectuer le rendu en mettant D3DPRESENT_INTERVAL_TWO.... on peut aussi attentre 3 ou 4 périodes en mettant three et four à la place. Plus on laisse passer de retraces periodes entre 2 frames plus le nombre d'images par secondes serra bas. Donc pour un rendu de qualité optimale il faut mettre ONE, à condition que la puissance de la becane le permette. Dans les jeux cette technique qui élimine les artéfacts est appellée Synchronisation verticale, ca doit vous dire quelque chose ;). Pour finir si on met D3DPRESENT_INTERVAL_DEFAULT, le device choisi tout seul la méthode à employer (je le déconseil).

Je sais c'était long et peu être chiant à lire pour certains mais j'espere que cette déscription aidera quelques-uns à mieux comprendre le fonctionnement du device de directX 9.
Si vous avez remarqué des erreurs dans mes explication n'hésitez pas à me le faire savoir, je ne suis pas infaillible. Et pour ceux qui aurait des questions sur DirectX.... on peut me joindre sur msn (cali7-0@hotmail.fr).
seb2086 Messages postés 96 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 1 février 2010
25 juin 2006 à 19:51
Ok je vais donc détailler encore plus .Merci
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
25 juin 2006 à 15:59
Très bien mais il serais intéressent de documenter encore plus la création du buffer image comme par exemple:

// Si l'application est en mode Windows ou Plein écran
d3dpp.Windowed = TRUE;
// Mode d'échange entre le FontBuffer et le BackBuffer
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
// Format du pixel du BackBuffer
d3dpp.BackBufferFormat = d3ddm.Format;
// Activation du Depth et Stencil Buffer
d3dpp.EnableAutoDepthStencil = TRUE;
// Format du Depth et Stencil
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
// Type de synchonisation de l'échange des Buffers
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
seb2086 Messages postés 96 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 1 février 2010
25 juin 2006 à 11:44
Ok merci en fait je me suis pas soucié de ca pour le moment j'ai juste mis une lampe pour les colorisation et donc je n'ai pas du tout pris en compte l'ombre.

Merci de ton commentaire
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
25 juin 2006 à 11:42
Salut,

Combien de normales a ton cube ? 8 apparement à cause des ombres.
Pour chaque un pixel, la carte calcule la normale à ce pixel (interpolation linéaire des normales des vertex de la face) et déduit du produit scalaire de cette normale avec la direction de la lumière, l'intensité de l'ombre.
Si les normales des vertex de chaque face ne sont pas dans la même direction, tu ne pourras pas avoir d'ombre uniforme.

Il faut que tu portes le nombre de vertex à 24 (8 actuels * 3 normales par sommet) si tu veux des ombres plus réalistes.

Bonne continuation
seb2086 Messages postés 96 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 1 février 2010
25 juin 2006 à 10:52
Merci je suis moi même débutant avec directx c'est pour ca que je pense que cette source s'adresse plus particulièrement aux débutants.

Merci de tes encouragements
cs_jmhC Messages postés 108 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 10 août 2007
25 juin 2006 à 10:50
Bonne initiative pour les débutants.
Rejoignez-nous