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

XNA/Monogame Discussion :

[XNA] Méthode DrawIndexedPrimitives


Sujet :

XNA/Monogame

  1. #1
    Membre actif Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 216
    Points : 248
    Points
    248
    Par défaut [XNA] Méthode DrawIndexedPrimitives
    Bonjour à tous,

    J'ai quelques difficultés à comprendre le fonctionne de la méthode DrawIndexedPrimitives, notamment en ce qui concerne les différents offseats applicables en paramètre.

    Ma situation est la suivante : je souhaite afficher un repère orthonormé (donc 3 lignes, une vers X, une autre vers Y et une troisième vers Z) ainsi qu'un triangle en 3D (soit trois vertex de déclarés). Jusque là aucun problème, je charge mes vertex et mes index sans difficulté. Au moment du rendu de ma scène, je génère alors un VertexBuffer qui contient tous mes points et un IndexBuffer qui contient tous mes indices. J'ai alors la structure suivante : (j'ai mis du pseudo-code, histoire de simplifier la lecture)

    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
     
    VertexBufferDeTouteMaScene = {
    0,0,0       // Mon repère orthonormé
    1,0,0
    0,0,0
    0,1,0
    0,0,0
    0,0,1
     
    0,0,0       // Le triangle
    10,10,0
    10,0,0
    }
     
    IndexBufferDeTouteMaScene = {
    0,1       // Mon repère orthonormé
    2,3
    4,5
     
    6,7,8       // Le triangle
    }
    À cette étape, ma scène s'affiche correctement. Je cherche alors à ajouter un quatrième vertex dans mon VertexBuffer (qui ne sera évidemment pas utilisé pour afficher mon triangle). Là où je corse un peu les choses, c'est que pour mon triangle, je relie les vertex 6, 8 et 9.

    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
     
    VertexBufferDeTouteMaScene = {
    0,0,0       // Mon repère orthonormé
    1,0,0
    0,0,0
    0,1,0
    0,0,0
    0,0,1
     
    0,0,0      // Le triangle
    0,10,0     // <-- je ne souhaite pas utiliser ce point pour dessiner le triangle
    10,10,0
    10,0,0
    }
     
    IndexBufferDeTouteMaScene = {
    0,1            // Mon repère orthonormé
    2,3
    4,5
     
    6,8,9            // Le triangle
    }
    Et pourtant, lors de l'affichage, c'est comme si j'avais relié les vertex 6,7 et 8 ensemble. J'ai donc regardé du côté de l'appel à DrawIndexedPrimitives où j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    graphics.GraphicsDevice.DrawIndexedPrimitives(
    	currentMesh.PrimitiveType,
    	offsetReadVertex, 0,
    	currentMesh.GetVertexList().Count, 0,
    	currentMesh.GetNumberOfPrimitives());
    Pour info :
    • currentMesh.PrimitiveType = tantôt LineList, tantôt TriangleList
    • offsetReadVertex = 0 lors de l'affichage du repère orthonormé, 6 lors de l'affichage du triangle
    • currentMesh.GetVertexList().Count = 6 lors de l'affichage du repère orthonormé, 4 lors de l'affichage du triangle vu que j'ai 4 vertex dans mon VertexBuffer (doit-il valoir 3 ???)
    • currentMesh.GetNumberOfPrimitives() = 3 lors de l'affichage du repère orthonormé, 1 lors de l'affichage du triangle vu que je n'affiche qu'une seule primitive


    Sauriez-vous où j'ai commis une erreur ?

    Merci d'avance pour vos réponses.

    ______
    edit : Parce qu'une illustration vaut parfois mieux qu'un long discours, j'ajoute une capture d'écran de mon problème :


    Mon triangle devrait être formé par les vertex 6, 8, 9 et pourtant, le vertex 7 est pris en compte
    Chen norris
    C/C++, C#, Java, PHP & SQL coder
    Web developer

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je crois que votre problême révèle juste d'une mauvaise utilisation du back face culling, qui est une technique d'acceleration 3D qui n'affiche pas les faces que sont orienté en nous tournant le dos ( soit l'intérieur d'une boite, par exemple ).

    Plus précisément, il existe une fonction pour le désactiver ( un Culling quelque chose, ou CullFace ). Sinon la vrai méthode de correction, car le désactiver prend du temps, c'est de dessiner tout les vertices des triangles dans le même sens ( si je me rappelle bien, c'est le sens anti horaire ). Ceci peut être corrigé en changeant les indices
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre actif Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 216
    Points : 248
    Points
    248
    Par défaut
    Pour ce qui est de l'ordre de déclaration des vertex, je confirme, tout est géré du côté de Cull.mode, où l'on indique de dessiner soit :
    • dans le sens horaire (CullMode = CullMode.ClockWise),
    • dans le sens anti-horaire (CullMode = CullMode.CounterClockWise),
    • on ne prend pas en compte le sens (CullMode = CullMode.None) et là, tous les vertex sont dessinés quel que soit le sens dans lequel on visualise le triangle.


    Dans mon cas, je suis en CullMode = CullMode.None donc il ne s'agit pas de mon problème. Ici, le souci est que le triangle que je visualise ne devrait même pas exister (puisqu'il prend en compte un vertex que je souhaite justement ne pas prendre en compte).
    Chen norris
    C/C++, C#, Java, PHP & SQL coder
    Web developer

  4. #4
    Membre actif Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 216
    Points : 248
    Points
    248
    Par défaut
    Du nouveau sur mon problème : je viens de me rendre compte que mes indices de vertex n'étaient pas du tout pris en compte. Du coup, quand je dessine, sachant que j'ai déclaré au GraphicsDevice que je dessinais des triangleList, mes vertex sont pris dans l'ordre de leur déclaration.

    C'est très gênant car je perds du coup tous les avantages de passer par une indexation de vertex. Au moment de dessiner, j'utilise pourtant bien la méthode DrawIndexedPrimitives. Une idée de ce que j'aurais pu omettre ?


    ___________ EDIT ___________

    Après quelques recherches sur le net, je suis tombé sur une autre manière de dessiner des CustomVertex indexés qui est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionColor>(
        PrimitiveType.TriangleList,
        pointList,
        0,   // vertex buffer offset to add to each element of the index buffer
        8,   // number of vertices to draw
        triangleListIndices,
        0,   // first index element to read
        6    // number of primitives to draw
    );
    Je viens de l'utiliser en lieu et place de DrawIndexedPrimitives et tout est rentré dans l'ordre. Mes index sont parfaitement gérés, je peux décider de ne pas prendre en compte certains vertex, … Je marque donc le sujet comme résolu.

    Merci pour le coup de pouce en tous cas
    Chen norris
    C/C++, C#, Java, PHP & SQL coder
    Web developer

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 255
    Points : 445
    Points
    445
    Par défaut
    Salut,

    C'est bien ce que je pensais, il commence à l'index 6 et prend les 2 suivants (donc 6,7,8) et ne tient pas compte de ton 6,8,9.
    Sinon essaie du côté de DrawUserIndexedPrimitives:
    http://www.riemers.net/eng/Tutorials...s1/Indices.php

    Salutations.

  6. #6
    Membre actif Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 216
    Points : 248
    Points
    248
    Par défaut
    Yep, je confirme, en faisant 2-3 tests en modifiant mes couleurs de vertex chargés, je me suis rendu compte qu'il les prenait dans l'ordre dans lequel ils étaient déclarés dans mon VertexBuffer, sans tenir compte d'aucun indice. Comme tu l'as souligné, je suis parti sur DrawUserIndexedPrimitives.
    Chen norris
    C/C++, C#, Java, PHP & SQL coder
    Web developer

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

Discussions similaires

  1. [Méthodes]UML vs MERISE Lequel pour quoi ?
    Par Daniel258 dans le forum Méthodes
    Réponses: 5
    Dernier message: 31/03/2003, 11h49
  2. Gros Problème avec DirectShow et la méthode RELEASE
    Par Olivier Delmotte dans le forum DirectX
    Réponses: 3
    Dernier message: 10/03/2003, 18h10
  3. [Singleton] Différences avec méthodes statiques
    Par Franche dans le forum Design Patterns
    Réponses: 1
    Dernier message: 26/02/2003, 17h10
  4. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 14h26
  5. Cryptage en C selon la méthode de césat
    Par shenron dans le forum C
    Réponses: 2
    Dernier message: 31/05/2002, 08h22

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