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 :

Problemes avec DrawIndexedPrimitive


Sujet :

DirectX

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 17
    Points : 7
    Points
    7
    Par défaut [Résolu] Problemes avec DrawIndexedPrimitive
    Bonjour,

    Je suis en train de me détruire les neurones avec l'utilisation de cette fonction.

    En effet, j'utilise un seul gros Vertex Buffer et un seul gros Index Buffer.

    Je stocke toutes mes meshs les unes à la suite des autres et je garde la trace de chacune de ces mesh dans une structure relativement simple contenant les membres :

    m_vertex_debut // Début dans le tableau des vertex
    m_vertex_taille // Nombre de vertex
    m_index_debut // Début dans le tableau des index
    m_index_taille // Nombre de faces

    Ensuite pour afficher tout ça je fais l'appel suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    m_device->DrawIndexedPrimitive
                            (D3DPT_TRIANGLELIST,   // Type
                             mesh.m_vertex_debut,   // BaseVertexIndex
                              0,                                // MinIndex
                              mesh.m_vertex_taille,   // NumVertices
                              mesh.m_index_debut,   // StartIndex
                              mesh.m_index_taille);   // PrimitiveCount
    A noter que les index de chaque mesh commencent à 0, c'est pourquoi j'ai utilisé le paramètre BaseVertexIndex.
    Tout se passe bien pour le 1er mesh (position 0 dans le tableau de vertex et dans le tableau d'index), par contre les suivant présentent tous des anomalies : les vertex sont bien présents mais la plupart des faces sont dans les choux.

    Voici un exemple avec 2 sphères, chacune à 8 faces et 6 vertex :

    Exemple 2 sphères

    La sphère de droite est normale, celle de gauche beaucoup moins. Pour s'en rendre mieux compte, on peut activer ou désactiver le culling avec les flèches gauche et droite.
    Les flèches haut et bas permettent de changer le type de rendu.
    Espace fait une pause de 3 secondes
    Esc pour sortir.

    Ah oui, j'ai bien vérifié que les données dans les tableaux soient bonnes

    Pourtant j'ai bien lu la doc de DrawIndexedPrimitive et je pense que j'envoie les bons paramètres.

    Si quelqu'un aurait une idée sur ce phénomène...

    Merci pour votre aide

    Atalmapi

  2. #2
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    J'ai trouvé la solution et j'espère que cela évitera à d'autres personnes des prises de têtes.

    Le problème était avec le StartIndex : je mettais la position dans mon tableau d'index, qui est un tableau de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct 
    {
      unsigned short int  v1,v2,v3;
    };
    Or DirectX ne l'entend pas de cette oreille, car pour lui chaque v1, v2 et v3 et considéré comme un index différent. Pour StartIndex il fallait mettre
    3*mesh.m_index_debut et non seulement mesh.m_index_debut.

    Voici l'appel correct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    m_device->DrawIndexedPrimitive 
                            (D3DPT_TRIANGLELIST,      // Type 
                             mesh.m_vertex_debut,      // BaseVertexIndex 
                              0,                                    // MinIndex 
                              mesh.m_vertex_taille,      // NumVertices 
                              3*mesh.m_index_debut,   // StartIndex 
                              mesh.m_index_taille);      // PrimitiveCount

    Merci à ceux qui auront pris la peine de lire ce message !!!

    Atalmapi

  3. #3
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par atalmapi
    Le problème était avec le StartIndex : je mettais la position dans mon tableau d'index, qui est un tableau de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct 
    {
      unsigned short int  v1,v2,v3;
    };
    oui les index buffers sont considérés comme un tableau de int (ou int16)
    notamment ils peuvent servir à d'autres usages que les triangle lists (triangle strips, points etc..)

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

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

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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