IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

[Debutant] Affichage du contenu d'un vertex buffer


Sujet :

DirectX

  1. #1
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut [Debutant] Affichage du contenu d'un vertex buffer
    Salut à tous,
    Je fais une petite migration du monde OpenGL vers le monde DirectX et plus particulierement Direct3D
    J'essaye de faire une petite application toutes simple qui dessine un triangles dont les vertices sont stockees dans un vertex buffer. Mais l'ecran reste noir, j'ai du mal a saisir pourquoi
    Je vous donne la partie d'affichage de mon code et la definition de mes FVF.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
     
     
    /*-------------------------------------------------
     |
     | CMain.cpp
     |
     | Point d'entree du programme
     |
     \-------------------------------------------------*/
     
    #include <d3d9.h>
    #include <d3dx9.h>
    #include "CVertex.h"
    #include "CWindow.h"
    #include "CWndproc.h"
     
    /* ----- WinMain : Point d'entree Windows ----- */
    int WINAPI WinMain(HINSTANCE hinstance, /* Handle d'instance de l'applciation */
                       HINSTANCE hPrevInstance,/* NULL sous Win32 */
                       LPSTR lpCmdLine,/*Pointeur vers la ligne de commande */
                       int nCmdShow)   /*Indique comment Window affiche la fenetre*/
    {
    	CWindow Main_Window;
     
    	/* Creation de la fenetre */
    	Main_Window.Create(640,480,hinstance,WinProc);
     
    	/* Creation de l'objet Direct3D */
    	LPDIRECT3D9 pD3D = NULL;
    	pD3D = Direct3DCreate9(D3D_SDK_VERSION);
     
    	/* Mode d'affichage */
    	D3DDISPLAYMODE d3ddm;
        pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm);
     
    	/* */
    	D3DCAPS9 d3dCaps;
    	pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&d3dCaps);
     
    	/* Les flags */
    	DWORD dwBehaviorFlags = 0;
    	dwBehaviorFlags |= D3DCREATE_HARDWARE_VERTEXPROCESSING;
     
    	/* Parametre de creation du Device */
    	D3DPRESENT_PARAMETERS d3dpp;
    	memset(&d3dpp, 0, sizeof(d3dpp));
     
            d3dpp.BackBufferFormat       = d3ddm.Format;
    	d3dpp.SwapEffect             = D3DSWAPEFFECT_DISCARD;
    	d3dpp.Windowed               = TRUE;
            d3dpp.EnableAutoDepthStencil = TRUE;
            d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
           d3dpp.PresentationInterval   = D3DPRESENT_INTERVAL_IMMEDIATE;
     
     
    	/* Creation du peripherique 3D */
    	LPDIRECT3DDEVICE9 pD3Device = NULL;
    	int error = pD3D->CreateDevice(D3DADAPTER_DEFAULT,
    								   D3DDEVTYPE_HAL,
    								   Main_Window.GetHandle(),
    								   dwBehaviorFlags,
    								   &d3dpp,
    								   &pD3Device);
     
    	/* Erreur lors de la creation du device ? */
    	switch(error)
    	{
    		case D3DERR_NOTAVAILABLE:
    			MessageBox(Main_Window.GetHandle(),
    				       "Technique demandee non disponible",
    					   "Erreur: D3DERR_NOTAVAILABLE", 0); 
    			exit(1);
    			break;
     
    		case D3DERR_OUTOFVIDEOMEMORY:
    			MessageBox(Main_Window.GetHandle(),
    				       "Pas assez de memoire pour l'operation demandee.",
    					   "Erreur: D3DERR_OUTOFVIDEOMEMORY", 0); 
    			exit(1);
    			break;
     
    		case D3DERR_INVALIDCALL:
    			MessageBox(Main_Window.GetHandle(),
    				       "Methode appellee invalide",
    					   "Erreur: D3DERR_INVALIDCALL", 0); 
    			exit(1);
    			break;
    	}
     
    	/* Creation du vertex buffer */
    	LPDIRECT3DVERTEXBUFFER9 vertexBuffer = NULL;
    	pD3Device->CreateVertexBuffer(sizeof(struct VERTEX_SIMPLE)*3,
    								  D3DUSAGE_WRITEONLY,
    								  D3DFVF_VERTEXSIMPLE,
    								  D3DPOOL_DEFAULT,
    								  &vertexBuffer,
    								  NULL);
     
    	/* Initialisation du vertex buffer */
    	struct VERTEX_SIMPLE* buffer;
    	vertexBuffer->Lock(0,sizeof(struct VERTEX_SIMPLE)*3,(void**)&buffer,D3DLOCK_DISCARD);
    		/* Vertex a gauche */
    		buffer[0].x = -1.0f;
    		buffer[0].y =  0.0f;
    		buffer[0].z =  0.0f;
    		buffer[0].color = D3DCOLOR_COLORVALUE( 1.0, 0.0, 0.0, 1.0 ); /* Rouge */
     
    		/* Vertex haut */
    		buffer[1].x = 0.0f;
    		buffer[1].y = 1.0f;
    		buffer[1].z = 0.0f;
    		buffer[1].color = D3DCOLOR_COLORVALUE( 0.0, 1.0, 0.0, 1.0 ); /* Vert */
     
    		/* Vertex a droite */
    		buffer[2].x = 1.0f;
    		buffer[2].y = 0.0f;
    		buffer[2].z = 0.0f;
    		buffer[2].color = D3DCOLOR_COLORVALUE( 0.0, 0.0, 1.0, 1.0 ); /* Bleu */
    	vertexBuffer->Unlock();
     
    	/* On definit la source pour l'affichage */
    	pD3Device->SetStreamSource(0,vertexBuffer,0,sizeof(struct VERTEX_SIMPLE));
    	pD3Device->SetFVF(D3DFVF_VERTEXSIMPLE);
     
    	/* Affichage de la fenetre */
    	Main_Window.Show();
     
    	/* Variable pour stocker les messages a traiter */
        MSG msg;
    	/* Boucle principale */
    	while(1)
    	{
    	    /* Est ce qu'il y a un message ? */
    		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
    			/* Message pour quitter l'application ? */
    			if(msg.message == WM_QUIT)
    				break;
                /* On passe la main pour le traitement du message */
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
    		/* Aucun message on continu l'affichage */
    		else
    		{
    			/* Fonction principale pour le 'rendering' */
    			pD3Device->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
    							 D3DCOLOR_COLORVALUE(0.0f,1.0f,0.0f,1.0f), 
    							 1.0f,
    							 0);
     
    			pD3Device->BeginScene();
    				/* Dessin du triangle ! */
    				pD3Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1 );
    			pD3Device->EndScene();
     
    			pD3Device->Present( NULL, NULL, NULL, NULL );
            }
    	}
     
    	/* Liberation de la memoire */
    	vertexBuffer->Release();
        pD3Device->Release();
        pD3D->Release();
     
    	return 0;
    }
    Le FVF :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /* --- Structure d'un vertex simple --- */
    #define D3DFVF_VERTEXSIMPLE (D3DFVF_XYZ | D3DFVF_DIFFUSE)
    struct VERTEX_SIMPLE
    {
    	float x,y,z;      /* D3DFVF_XYZ     */
    	DWORD color;      /* D3DFVF_DIFFUSE */
    };
    Merci d'avance a ceux qui prendront le temps de voir tout ça !

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu n'as pas défini tes matrices de transformation.

  3. #3
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Quel idiot, bien sur Bon je vais voir ça

  4. #4
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Je viens de definir une matrice de translation applicable à la scène : (translation sur l'axe z).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    pD3Device->BeginScene();
    /* Transformation du triangle */
    D3DXMATRIX matrix_World;
    D3DXMatrixTranslation(&matrix_World, 0.0f, 0.0f, 3.0f);
    pD3Device->SetTransform(D3DTS_WORLD, &matrix_World);
    /* Dessin du triangle ! */
    pD3Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
    pD3Device->EndScene();
    Je me suis dis qu'il fallait aussi initialiser le FOV j'ai donc rajouté ceci avant la creation du vertex buffer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    /* Initialisation de la position et FOV de la camera */
    D3DXVECTOR3 CameraPosition;
    CameraPosition.x = 0;
    CameraPosition.y = 0;
    CameraPosition.z = -5;
     
    D3DXVECTOR3 lookAtPosition;
    lookAtPosition.x = 0;
    lookAtPosition.y = 0;
    lookAtPosition.z = 20;
     
    D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f);
     
    D3DXMATRIX matrix;
    D3DXMatrixLookAtLH(&matrix, &CameraPosition, &lookAtPosition, &vUpVec);
    pD3Device->SetTransform(D3DTS_VIEW,&matrix);
    ça ne change rien, un truc a du m'échapper.
    Je continus les recherches.

  5. #5
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Bon décidemment je n'y arrive pas, si quelqun a une piste je suis preneur
    le code Direct3D en lui même me semble pas mauvais, peut etre un problème dans la création de ma fenetre Win32 ?

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Et la matrice de projection :

  7. #7
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    J'avoue avoir toujours eu du mal avec les transformations matricielles. Beaucoup de mal à les aborder et comprendre comment elles fonctionnent.
    On distingue les transformations d'une scène en 3 temps non ?
    Premièrement la "world transformation", ensuite la "view transformation" et pour la finir le "view frustrum" non ?
    Ici il me manquerait donc le "view frustrum" ?

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pas "view frustum" (-> pyramide tronquée représentant le champ de vision), mais "projection". A part ça oui, tu es dans le bon.

  9. #9
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Ces transformations matricielles sont Hardware et se déroulent dans le module T&L du pipeline de la CG non ?
    Quand je fais un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pD3Device->SetTransform(D3DTS_WORLD, &matrix_World);
    par exemple.

    Cela va appliquer cette transformation à tout les objets de la scène par rapport a leur propre repere ?

  10. #10
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Je viens de reprendre le tout premier code que j'ai posté, en utilisant le code de création de la fenetre d'un autre tutorial et cela fonctionne, DirectX doit initialiser des matrices par defaut... enfin bref le probleme semble donc venir de mon code Win32.

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ces transformations matricielles sont Hardware et se déroulent dans le module T&L du pipeline de la CG non ?
    Oui.

    Cela va appliquer cette transformation à tout les objets de la scène par rapport a leur propre repere ?
    Oui. Par contre un objet n'a pas à proprement parler de repère, donc c'est justement via la matrice world qu'on indique celui-ci.

    Je viens de reprendre le tout premier code que j'ai posté, en utilisant le code de création de la fenetre d'un autre tutorial et cela fonctionne, DirectX doit initialiser des matrices par defaut... enfin bref le probleme semble donc venir de mon code Win32
    Faut voir ce que dit la doc quant aux valeurs par défaut des matrices, mais de toute façon il ne faut jamais s'y fier ; d'autant plus que les valeurs par défaut pour ces matrices (si elles existent je suppose qu'il s'agit des matrices identités) ne seront jamais appropriées.

    Mais effectivement je pense que c'est un problème d'initialisation, puisque ton écran, même vide, ne devrait pas être noir (tu as du magenta comme couleur d'effacement). Dans ce cas essaye de remplacer progressivement le code qui marche par le tien, et vois à quel moment ça ne fonctionne plus.

  12. #12
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Comment une seule Matrice va pouvoir indiquer un repere à chaque objet de la scène ? En multipliant toutes les matrices de transformation de chaque objet entre elles pour n'en former qu'une ?
    Edit : Au passage j'ai trouvé la solution.
    Voila ce que j'avais dans ma fonction de gestion des messages Windows associé à ma fenêtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    case WM_PAINT:
    break;
    Donc on ne passait jamais dans la partie du code qui s'occupait d'afficher mon vertex buffer à l'écran.

  13. #13
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Comment une seule Matrice va pouvoir indiquer un repere à chaque objet de la scène ? En multipliant toutes les matrices de transformation de chaque objet entre elles pour n'en former qu'une ?
    Il faut bien sûr envoyer une nouvelle matrice pour chaque objet à afficher.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème d'affichage d'un vertex buffer
    Par manimouleLight&Magic dans le forum OpenGL
    Réponses: 3
    Dernier message: 26/02/2008, 18h02
  2. [debutant]affichage du contenu d'un tableau dans du JTextField
    Par mehdi_swatch dans le forum Composants
    Réponses: 2
    Dernier message: 30/11/2006, 12h16
  3. [DX9][C#] Affichage cube avec vertex buffer
    Par lancer83 dans le forum DirectX
    Réponses: 43
    Dernier message: 30/06/2006, 13h16
  4. pb Affichage Vertex buffer
    Par mushishi dans le forum DirectX
    Réponses: 11
    Dernier message: 28/03/2006, 04h07
  5. Réponses: 3
    Dernier message: 09/02/2003, 02h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo