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

OpenGL Discussion :

OpenGL et C++ : tampon d'identifiants


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 17
    Par défaut OpenGL et C++ : tampon d'identifiants
    langage : C++, OpenGL
    environnement : cygwin
    compilateur : g++
    ----------------------------

    Bonjour,

    Je m'arrache les cheveux depuis deux jours sur un bug fantôme. J'ai mis
    presque toute mon équipe à contribution, en vain. Peut être que vous pourrez m'aider.

    J'ai un vecteur de segments. Je voudrais afficher chacun avec une couleur qui l'identifie de façon unique. Voici mon code :

    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
    // Conversion  de mon identifiant en valeurs rgb :
    void id2rgb(const unsigned int &id, unsigned char &r, unsigned char &g,
    unsigned char &b){
      unsigned int rfilter = 0x000000FF;
      unsigned int gfilter = 0x0000FF00;
      unsigned int bfilter = 0x00FF0000;
      unsigned int rint = rfilter & id;
      unsigned int gint = gfilter & id; gint = gint>>8;
      unsigned int bint = bfilter & id; bint = bint>>16;
      r = (unsigned char)rint;
      g = (unsigned char)gint;
      b = (unsigned char)bint;};
     
    //affichage de mon tampon :
    unsigned char r, g, b;
    glDrawBuffer(GL_BACK);
    for(unsigned int i=0; i<_segments.size(); i++){ // parcours de tous les
                                                                         //segments, leur numéro                   
                                                                         // dans le vecteur est leur      
                                                                         //identifiant
       if(i<16777215) {// correspondant à l'identifiant maximal pouvant être
                               //contenue dans les valeurs (r,g,b)
          id2rgb(i, r, g, b);
          glLineWidth(1.);
          glShadeModel(GL_FLAT);
          glBegin(GL_LINES);
          glColor3ub(r,g,b);
          glVertex3f( _segments[i]._debut.get_x(),   
                          _segments[i]._debut.get_y(),
                          _segments[i]. _debut.get_z());
          glVertex3f( _segments[i]._fin.get_x(),    
                           _segments[i]._fin.get_y(),
                           _segments[i]._fin.get_z());
          glEnd();}}
     glutSwapBuffers();

    Or, dans l'image que j'obtiens, il existe plusieurs segments avec le même identifiant !!! J'ai évidemment écrit la fonction inverse de id2rgb :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void rgb2id(const unsigned char &r, const unsigned char &g, const unsigned
    char &b, unsigned int &id){
      unsigned int rint = (int)r;
      unsigned int gint = (int)g;
      unsigned int bint = (int)b;
      gint= gint<<8;
      bint= bint<<16;
      id= rint+gint+bint;};
    mais, les instructions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int a, b;
    cin >> a;
    id2rgb(a,r,g,b);
    rgb2id(r,g,b,b);
    cout <<b; //me renvoie toujours un b identique à a.
    Bref, je suis clouée.
    Merci pour votre aide,

    Audrey
    legeaiau@etu.utc.fr

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 53
    Par défaut
    En fait c'est un problème de passage de parametres pas valeur et non pr référence. Tu met bien un & devant chaque parametre mais tu passe la valeur de b et non la référence. Donc tes appels devraient etre:

    id2rgb(&a,r,g,&b);
    id2rgb(&a,r,g,&b);

    et non

    id2rgb(a,r,g,b);
    id2rgb(a,r,g,b);

    enfin je pense que ça vient de la. Passe peut etre * au lieu de & dans les parametres de tes fonction car si tu compiles en C++, const ... & fait une copie du parametre et ne modifie donc pas la var originale:

    void rgb2id(unsigned char *r, unsigned char *g, unsigned char *b, int *id){
    ...
    }

    tiens moi au courant si ça marche.

  3. #3
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    Les passages de paramètres sont bons, passer un paramètre en tant que référence est exactement la même chose que de passer l'adresse du paramètre et se servir d'un pointeur, par exemple :
    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
    int GetA(int* a)
    {
       return *a;
    }
     
    int GetA(int& a)
    {
       return a;
    }
     
    void main(void)
    {
       int a;
       GetA(&a); // appelle GetA(int* a)
       GetA(a); // appelle GetA(int& a);
    }
    par contre dans ton exemple :
    id2rgb(&a,r,g,&b);
    tu transmet les adresses de a et de b, pas les références (erreur à la compilation)

    const ... & fait une copie du parametre et ne modifie donc pas la var originale
    Erreur, passer une référence évite qu'une copie soit faite, ajouter const indique au compilo que la variable ne sera pas modifiée (le compilo génèrera une erreur si tu essayes de modifier le contenu de la variable)

    la fonction recoit la copie du contenu d'une variable int, a peut etre modifié sans affecter la variable qui a été utilisée en paramètre

    la fonction reçoit la référence d'une variable int, si on modifie le contenu de a alors le contenu de la variable qui a été utilisée en paramètre est aussi modifié

    la fonction recoit l'adressee d'une variable int, modifier de contenu de a se fait avec l'expression *a = 10; par exemple, le contenu de la variable utilisée en paramètre est modifié

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void GetA(const int& a);
    la fonction reçoit la référence d'une variable int, le mot clef const fait qu'en cas de tentative de modification du contenu de a (qui modifierait le contenu de la variable utilisée en paramètre) le compilateur génèrera une erreur

    fais quelques essais et trace ton prog en mode debug pour voir comment ça se passe
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  4. #4
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 17
    Par défaut
    Hello,
    Pas la peine de se fatiguer à chercher des erreurs dans le passage de paramètres, ils sont corrects. Mon problème venait de tout autre part
    j'avais manqué de nettoyer mon buffer d'identifiant alors que je faisais des rendus successifs dans mon programme. Merci quand même pour votre aide.
    A++

Discussions similaires

  1. Les tampons GPU-CPU persistants en OpenGL
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 02/06/2015, 21h44
  2. [2D/3D] Erreur inconnue / non identifié avec Qt OpenGL sous MacOs X
    Par Petit_Nuage dans le forum Qt
    Réponses: 1
    Dernier message: 25/06/2010, 00h26
  3. Réponses: 1
    Dernier message: 12/01/2006, 22h00
  4. OpenGL ou DirectX
    Par Nadir dans le forum DirectX
    Réponses: 6
    Dernier message: 02/05/2002, 12h48
  5. Opengl -- Les surfaces
    Par Anonymous dans le forum OpenGL
    Réponses: 2
    Dernier message: 02/05/2002, 10h14

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