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 :

dessiner lignes et polygones


Sujet :

DirectX

  1. #1
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut dessiner lignes et polygones
    Bonjour

    quelqu'un a t-il une idée pour tracer des lignes et polygones 2D avec directX ?

    d'avance merci

  2. #2
    Membre régulier
    Inscrit en
    Mai 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 99
    Points : 115
    Points
    115
    Par défaut
    ID3DXLine ou DrawPrimitive avec Line lists ou line strips

  3. #3
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    thank you

  4. #4
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    IDX3DLine ne semble exister qu'en DX9, moi je code sous DX8, donc je me suis intéressé à drawprimitive, mais soit il y a une solution miséreuse avec des buffer, des locks etc... le bazard total, soit j'ai vu une solution en gros comme ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            D3DLVERTEX l_vertices[2];
            l_vertices[0] = D3DLVERTEX(D3DVECTOR(_startX, _startY, 0), 0xFFFFFFFF, 0xFFFFFFFF, 0.0f, 0.0f);
            l_vertices[1] = D3DLVERTEX(D3DVECTOR(_endX, _endY, 0), 0xFFFFFFFF, 0xFFFFFFFF, 0.0f, 0.0f);
            device.DrawPrimitive(D3DPT_LINELIST, D3DFVF_LVERTEX, l_vertices, 2, D3DDP_WAIT);
    mais comme c'est très mal documenté, je ne sais pas du tout quoi utiliser
    , je veux juste tracer une ligne 2D à l'écran... quels vertex utiliser ? comment ? faut-il mettre D2DDP_WAIT, etc...

    une petite idée ?
    d'avance merci

  5. #5
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    j'ai vraiment du mal avec drawprimtive

    d'autant plus que D2DVERTEX et comagnie est défini dans <d3dtypes.h> et qu'il y a des conflits avec <d3dx8.h> du coup...

    sachant que si je mets ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <d3dx.h>
    #include <d3dx8.h>
    ca résoud des conflits, mais ca m'en sort d'autres au niveau de d3d8math.h avec une redéclaration de D3DXVECTOR3

    bref c'est la misère totale le .h avec directx....

    comment s'en sort on ?
    d'avance merci

  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
    comment s'en sort on ?
    En ne mixant pas les vieux headers et les nouveaux. Si tu bosses avec DirectX8, tu inclues d3dx8.h, c'est tout. Pareil pour les autres.

    En général, pour DirectGraphics 8, d3d8.h et d3dx8.h suffisent.

  7. #7
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    la declaration deD3DVERTEX n'existe que dans d3dtypes ...

  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
    Moi je n'ai aucun problème en incluant d3dtypes.h . Essaie avec d3d8types.h.

    Mais à mon avis tu auras plus vite fait de définir toi-même la structure de vertices qui correspond à ton FVF, je t'avoue que des D3DVERTEX j'en n'ai jamais vu nulle part.

    Sinon pour répondre à la question précédente, il faut que tu utilises DrawPrimitiveUP si tu n'as pas de vertex buffer. Mais c'est très lent.

  9. #9
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    alors avec le createbuffer, utilisé comme suit :

    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
     
           LPDIRECT3DVERTEXBUFFER8 l_vb;
     
       void * pVertices;     
     
      CUSTOMVERTEX g_Vertices[] =
       {
        { 25, 25, 0, 0xffff0000, },
        {  50,50, 0, 0xff0000ff, },
        {  18, 75, 0, 0xffffffff, },
       };
     
       if( device->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
                                                  0 , D3DFVF_CUSTOMVERTEX,
                                                  D3DPOOL_DEFAULT, &l_vb ) != D3D_OK )
     
       if(  l_vb->Lock( 0, sizeof(g_Vertices), (BYTE**)&pVertices, 0 ) !=D3D_OK  ) return;
     
       memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
     
       l_vb->Unlock();      
     
           g_pd3dDevice->SetStreamSource( 0, g_pVB, sizeof(CUSTOMVERTEX) );
           g_pd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX );
           g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 1 );  
     
            device->SetStreamSource( 0, l_vb, sizeof(CUSTOMVERTEX) );
    	device->SetVertexShader( D3DFVF_CUSTOMVERTEX );/
            device->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, 1 );
    ca me renvoie toujours NULL dans pVertices, qui fait planter dans le memcpy, forcément...

    ok puor DrawPrimitiveUP mais ceci n'affiche rien du tout

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      CUSTOMVERTEX g_Vertices[] =
       {
        { 25, 25, 0, 0xffff0000, },
        {  50,50, 0, 0xff0000ff, },
        {  18, 75, 0, 0xffffffff, },
       };
     
            device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 1, &g_Vertices, sizeof(CUSTOMVERTEX));
    ma surface directX étant 800*600*32, je devrai le voir...

    j'ai aussi essayé ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            static CUSTOMVERTEX g_Vertices[]={ //A square with a dark center
               {100,200,1,1, 0xFFFFFFFF}, {0,100,1,1,0xFFFFFFFF}, {200,100,1,1,0xFFFFFFFF},
               {200,300,1,1, 0xFFFFFFFF}, {0,300,1,1,0xFFFFFFFF}, {  0,100,1,1,0xFFFFFFFF}
            };
     
            device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 4, &g_Vertices, sizeof(CUSTOMVERTEX));
    avec ceci comme définition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct CUSTOMVERTEX {
            float x;
            float y;
            float z;
            float rhw;
            unsigned long color;
    };
    marche pas mieux...

  10. #10
    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
    Pour le 1) : je crois que c'est le Lock(0, qq_chose, ...) qu'il aime pas. Il faut mettre 0 aussi dans la taille à verrouiller (2eme paramètre), ça devrait passer mieux. Je crois que tu n'as le droit de faire ça qu'avec un buffer dynamique (avec le flag D3DLOCK_NOOVERWRITE) (enfin je dis ça un peu au pifometre).

    Pour le 2) : le fait que tu ne vois rien, ça peut venir d'une foule de choses. Par exemple un mauvais sens de culling, une matrice mal définie, un renderstate mal initialisé, ... En général c'est le culling
    Et aussi, n'utilise pas les TRIANGLEFAN.

    Pour le 3) : t'as un problème au niveau de tes vertices je crois. Essaye deja de rendre un seul triangle avec des TRIANGLELIST, ou un quad en TRIANGLESTRIP.

  11. #11
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    je n'ai pas mis de CULL, par défaut c'est activé ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct CUSTOMVERTEX {
            float x;
            float y;
            float z;
           // float rhw;
            unsigned long color;
    };
     
    #define CUSTOMVERTEX_FORMAT (D3DFVF_XYZ | D3DFVF_DIFFUSE)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            device->SetVertexShader(CUSTOMVERTEX_FORMAT);
     
            static CUSTOMVERTEX g_Vertices[]={
               {0,0,0,0xFFFFFFFF}, {100,100,0,0xFFFFFFFF},
               {0,100,0,0xFFFFFFFF}
            };
     
            device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1, &g_Vertices, sizeof(CUSTOMVERTEX));
    ca n'affiche rien du tout...

    toutes les autres fonctions (afficher du texte et rendre une texture) marchent impeccable

    en tout cas, merci de passer du temps à m'aider...

  12. #12
    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
    Par défaut le culling est a D3DCULL_CCW (sens inverse des aiguiles d'une montre).

    Et sinon, comment t'as initialisé tes matrice de world, view et proj ? T'as bien desactivé le lighting ?

  13. #13
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    voici mon initialisation :

    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
     
           Render2DSurfaceWin32 & l_surfaceWindows = (Render2DSurfaceWin32 &)_surface;
            deInitialize();
     
            direct3DObject = Direct3DCreate8(D3D_SDK_VERSION);
            if (!direct3DObject)         return false;
     
            if (direct3DObject->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm) != D3D_OK)      return false;
     
            memset(&d3dpp, 0, sizeof(D3DPRESENT_PARAMETERS));
     
            d3dpp.SwapEffect       =  D3DSWAPEFFECT_DISCARD ;
            d3dpp.BackBufferWidth  = _witdh;
            d3dpp.BackBufferHeight = _height;
            d3dpp.BackBufferCount  = 1;
            d3dpp.BackBufferFormat = d3ddm.Format;
    	if (_bpp == 32)    d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;  // !!! 32bits per pixel
            d3dpp.Windowed         = !_fullscreen;
     
            if (_fullscreen)         d3dpp.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE ;
     
    	if (direct3DObject->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, l_surfaceWindows.handle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &device) != D3D_OK)        return false;
     
    	if (D3DXCreateSprite(device, &spritesRoutines) != D3D_OK)                 return false;
     
    	memset(&deviceInfos, sizeof(D3DCAPS8), 0);
    	if (direct3DObject->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &deviceInfos) != D3D_OK)          return false;
     
            width  = _witdh;
            height = _height;
     
            renderClear();
            renderShow();
     
            return true;

  14. #14
    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
    Initialise au moins ta matrice de projection.
    Et il y a aussi quelques renderstates à initialiser pour ne pas avoir de surprises.

  15. #15
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    J'ai rajouté ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            D3DXMATRIX l_projection2DMatrix;
            D3DXMATRIX l_identityMatrix;
     
            D3DXMatrixOrthoLH(&l_projection2DMatrix, _width, _height, 0.0f, 1.0f);
            D3DXMatrixIdentity(&l_identityMatrix);
     
            device->SetTransform(D3DTS_PROJECTION, &l_projection2DMatrix);
            device->SetTransform(D3DTS_WORLD,      &l_identityMatrix);
            device->SetTransform(D3DTS_VIEW,       &l_identityMatrix);
     
            device->SetVertexShader(CUSTOMVERTEX_FORMAT);
    Alors maintenant le problème est le suivant :

    quand je n'affiche rien d'autre que le triangle:

    il a bien la bonne forme, mais il est rouge avec un dégradé vers le transparent en direction d'un bord (alors que je n'ai spécifié ca nulle part)

    quand je dessine une texture, puis le rectangle, je n'ai que la texture qui s'affiche, et parfois le triangle qui clignote derrière...

  16. #16
    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
    En fait ça irait plus vite si tu donnais un programme complet(mais petit !) qui compile, parce que là avec des bouts de coe c'est difficile de voir ce qui ne va pas .

  17. #17
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    Acceptes-tu que je t'envoies mon programme... tu verras il n'est pas gros

    (mais pour compiler il faut bien évidemment directx8, donc je peux aussi t'envoyer les lib directx8 si ca t'embete d'installer tout le sdk pour tester l'appli)
    NB : je teste sous builder

    si tu acceptes, envoies-moi ton email par mp


    NB2 : j'ai reverifié 1 par 1 tous les parametres avec ceux du tutorial de laurent USA (je veux aussi faire de la 2D en 3D)

  18. #18
    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
    Mon email est juste en-dessous (bouton "email"), et pour ce qui est du SDK Dx t'inquiete j'ai tout ce qu'il faut .

  19. #19
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    envoyé par mail, sinon je suis sous MSN pour toute question. le pseudo est celui de l'adresse mail

  20. #20
    mat.M
    Invité(e)
    Par défaut
    Avec Direct Draw y'a que 3 lignes de codes pour tracer des lignes !!
    On peut utiliser le GDI avec les surfaces Direct Draw.
    Excusez ma vulgarité mais c'est vraiment se faire ch... pour rien.

Discussions similaires

  1. Dessin de nombreux polygones
    Par vinpowful dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 06/07/2009, 15h26
  2. Dessiner correctement un polygone
    Par BruceBoc dans le forum OpenGL
    Réponses: 2
    Dernier message: 13/06/2007, 16h13
  3. Convertir une ligne en polygone texturé
    Par JohnSmith dans le forum SDL
    Réponses: 5
    Dernier message: 21/03/2007, 18h46
  4. Comment dessiner lignes entre des fenêtres ?
    Par Hauwke dans le forum Langage
    Réponses: 5
    Dernier message: 17/11/2005, 12h33
  5. Transformer une ligne en polygone
    Par bl4d3 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 02/09/2003, 09h35

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