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 :

Dessin d'un rectangle ou carré avec DirectX


Sujet :

DirectX

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Dessin d'un rectangle ou carré avec DirectX
    Bonjour à tous,

    Voilà je suis en train de me mettre à la modélisation avec DirectX.
    Je m'exerce avec DirectX 9 et j'utilise donc le framework 2.0.
    J'ai compris comment dessiner un triangle, ça il n'y a pas de soucis. Je sais aussi que toute base dans DirectX est le triangle par exemple donc dans mon cas pour dessiner mon rectangle se sera en associant deux triangles qui auront deux vertices communs.
    Mon problème est le suivant, comment dessiner deux triangles ?
    Mon code fonctionne pour un mais dès que je rajoute un vertex et que je modifie ce que j'ai à modifier en amont et en aval il ne garde que mes 3 premiers vertices. Il y a t'il une subtilité que j'aurais manqué ?
    Petite question supplémentaire : dois je plutôt utiliser dans mon device.DrawPrimitives un TriangleList ou un TriangleStrip ?
    Merci d'avance.

    Siphon

  2. #2
    Membre confirmé

    Inscrit en
    Août 2007
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 300
    Points : 527
    Points
    527
    Par défaut
    Sans code il est difficile d'indiquer le problème, car il dépend de la fonction que vous utilisez (DrawPrimitive, DrawIndexedPrimitive ?). Travaillez vous en C#/XNA (ma boule de cristal en déduit ça de votre mention de "framework 2.0")?

    La fonction que vous utiliserez le plus pour des meshes (groupes de nombreux triangles) sera la version dite "indexée" de device->draw, il vous faudra fournir à la fois un tableau de sommets (vertex buffer) et un tableau d'indice (16 ou 32 bits), qu'il faut remplir selon le choix de topologie que vous avez sélectionné (triangle list ou strip). Pour ce dernier point, je recommande triangle list, car le surcout est minimal en emplacement d'indices de sommet, et par contre cela vous permet des groupes de triangles sans gros effort de pré-traitement topologique, contrairement à triangle strip. A noter, NVidia propose un "stripifier" depuis 2006, mais recommande maintenant d'utiliser les listes.

    Pour le cas particulier très important des rectangles (nommés souvent "quads"), on n'a pas effectivement pas besoin de décomposer en sommet + index, mais je vous conseille de le faire quand même rapidement, ne serait-ce que pour vous habituer au cas général, et vous préparer à la suite logique, à savoir les instanciations.
    "Maybe C++0x will inspire people to write tutorials emphasizing simple use, rather than just papers showing off cleverness." - Bjarne Stroustrup
    "Modern C++11 is not your daddy’s C++" - Herb Sutter

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Points : 54
    Points
    54
    Par défaut
    Un triangle comme 15 000 triangles c'est la même chose
    Il ne faut pas oublier de changer le nombre de primitives à tracer dans DrawPrimitive, mettre le tout fans le sens des aiguilles d'une montre et ne pas oublier qu'on a 2 fois plus de vertex ( et donc besoin de 2 fois plus de mémoire ).

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Merci à vous deux pour vos réponses explicatives, je comprends un peu mieux, c'est sympa.
    Je vois vers quoi je dois m'orienté désormais, encore merci de m'avoir un peu mieux éclairé sur ces notions. ^^
    Je vous quote mon code avec donc ma tentative d'ajout d'un 4e vertex celui en index[3] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    using Microsoft.DirectX;
    using Microsoft.DirectX.Direct3D;
    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
       public partial class frmDirectX : Form
       {
          //Le Device
          private Device device = null;
          //Le VertexBuffer
          private VertexBuffer vBuffer;
          //Les Vertices (sommets)
          private CustomVertex.TransformedColored[] Vertices;
     
          //Initialisation de la form
          public frmDirectX()
          {
             InitializeComponent();
             //Appel de la procédure d'initialisation du device Direct 3D
             InitGraphics();
             //OnCreateDevice(device, null);
             CreateTriangles();
             //Event pour la boucle de rendu
             this.Paint += new PaintEventHandler(this.Render);
          }
          //Initialisation du device Direct 3D
          private void InitGraphics()
          { 
          //Définition des PresentParameters
             PresentParameters presentParams = new PresentParameters();
             presentParams.Windowed = true;
             presentParams.SwapEffect = SwapEffect.Discard;
             //Création du device
             device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
          }
          //Création des triangles et de la forme souhaitée
          private void CreateTriangles()
          {
             //Définition des vertices des triangles
             Vertices = new CustomVertex.TransformedColored[4];
             Vertices[0] = new CustomVertex.TransformedColored(350.0f, 400.0f, 1f, 1f, Color.WhiteSmoke.ToArgb());
             Vertices[1] = new CustomVertex.TransformedColored(350.0f, 50.0f, 1f, 1f, Color.WhiteSmoke.ToArgb());
             Vertices[2] = new CustomVertex.TransformedColored(750.0f, 50.0f, 1f, 1f, Color.WhiteSmoke.ToArgb());
             Vertices[3] = new CustomVertex.TransformedColored(100.0f, 100.0f, 0f, 1f, Color.Green.ToArgb());
             //Création du VertexBuffer
             vBuffer = new VertexBuffer(typeof(CustomVertex.TransformedColored), Vertices.Length, device, 0, CustomVertex.TransformedColored.Format, Pool.Default);
             //Stockage des vertices dans le VertexBuffer
             vBuffer.SetData(Vertices, 0, LockFlags.None);
          }
     
          //La boucle de rendu
          private void Render(object sender, PaintEventArgs e)
          {
             //Effacement de la scène
             device.Clear(ClearFlags.Target, 0, 1.0f, 0);
             //Début de la scène
             device.BeginScene();
             //Définition du VertexBuffer à lire
             device.SetStreamSource(0, vBuffer, 0);
             //Définition du type de vertices stockées dans le VertexBuffer
             device.VertexFormat = CustomVertex.TransformedColored.Format;
             //Dessine le VertexBuffer
             device.DrawPrimitives(PrimitiveType.TriangleList, 0, Vertices.Length / 4);
             //Fin de la scène
             device.EndScene();
             //Présentation de la scène
             device.Present();
          }
     
       }
    Voili voilou
    (Je suis preneur de toutes critiques bien entendu, je souhaite avancer ^^).
    Bonne journée
    Siphon

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Re,

    Pardon ac_wingless --> oui je code en C#.
    Siphon

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    C'est bon j'ai compris l'astuce avec DrawPrimitive.
    Merci à vous deux.
    Ci-dessous les modifications apportées pour que mon code fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
             //Définition des vertices des triangles
             Vertices = new CustomVertex.TransformedColored[6];
             Vertices[0] = new CustomVertex.TransformedColored(350.0f, 400.0f, 1f, 1f, Color.WhiteSmoke.ToArgb());
             Vertices[1] = new CustomVertex.TransformedColored(350.0f, 50.0f, 1f, 1f, Color.WhiteSmoke.ToArgb());
             Vertices[2] = new CustomVertex.TransformedColored(750.0f, 50.0f, 1f, 1f, Color.WhiteSmoke.ToArgb());
             Vertices[3] = new CustomVertex.TransformedColored(750.0f, 400.0f, 0f, 1f, Color.Red.ToArgb());
             Vertices[4] = new CustomVertex.TransformedColored(350.0f, 400.0f, 1f, 1f, Color.Red.ToArgb());
             Vertices[5] = new CustomVertex.TransformedColored(750.0f, 50.0f, 1f, 1f, Color.Red.ToArgb());
    et ensuite dans le DrawPrimitive :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
             //Dessine le VertexBuffer
             device.DrawPrimitives(PrimitiveType.TriangleList, 0, 2);
    Merci bien, je note ce topic comme résolu.
    A bientôt peut-être
    Siphon

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 467
    Points : 681
    Points
    681
    Par défaut
    Tu ferais mieux de passer à XNA 4.0

    C'est la même chose que directX 9... mais en mieux et plus simple.

    Surtout que DirectX Managed n'est plus mis à jour ni soutenu depuis plusieurs années

    XNA 4.0 c'est tout beau tout neuf et ça permet de faire des applications marchant aussi bien sur PC que sur XBOX et téléphone WP7

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Salut ijk-ref,

    Excuse moi pour le retard.
    En effet j'y avais pensé à XNA 4.0.
    Je vais voir, c'est en cours de test encore tout cela.
    Merci.

    Siphon

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/03/2012, 15h33
  2. dessiner un carré avec teechart
    Par jeffray03 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 23/08/2010, 09h24
  3. dessin d'un rectangle avec quatres points
    Par lbrnoss dans le forum Interfaces Graphiques en Java
    Réponses: 10
    Dernier message: 04/01/2010, 02h22
  4. Dessiner un contrôle .Net avec DirectX
    Par Mose dans le forum DirectX
    Réponses: 6
    Dernier message: 05/10/2006, 14h26
  5. Réponses: 3
    Dernier message: 05/10/2006, 13h16

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