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 :

[jogl]Problème avec glReadPixels


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 895
    Par défaut [jogl]Problème avec glReadPixels
    Bonjour

    Je travaille sur mon Color PIcking. Comme vous le savez, je fais de la visualisation de réseaux de molécules. Pour le moment, le color picking fonctionne à merveille pour les noeuds. Fort de cette expérience, je veux faire la même chose pour les liens.
    Voici la fonction qui me donne mes tables de "fausses" couleurs:
    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
     
    private Vector<float[]>attributeColors(int limit, boolean node){
            Vector<float[]>v = new Vector<float[]>(limit);
            for(int r=1; r<254; r++){
                for(int g=0; g<255; g++){
                    for(int b=0; g<255; g++){
                        int alpha = 255;
                        if(!node)
                            alpha=100;
                        Color c = new Color(r, g, b, alpha);
                        float[]comp = new float[4];
                        v.add(c.getComponents(comp));
                        if(v.size()==limit)
                            return v;
                    }
                }
            }
            return v;
        }
    Petit mot d'explication: je génère en réalité 2 vecteurs, un pour les noeuds, un autre pour les liens (paramètre boolean node dans ma méthode).
    J'ai vérifié, mes 2 vecteurs sont bien rendues avec des valeurs correctes. Comme vous le voyez, la valeur alpha est placé à 255 pour les noeuds et à 100 pour les liens.
    Voici maintenant ma méthode processing pour le color picking:
    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
     
        private void pickPoint(GL gl) {
            int[]viewport = new int[4];
            gl.glGetIntegerv(GL.GL_VIEWPORT, viewport, 0);
            gl.glReadBuffer(GL.GL_BACK);
     
            FloatBuffer fb = BufferUtil.newFloatBuffer(4);
     
            gl.glPixelStorei (gl.GL_UNPACK_ALIGNMENT, 1);
     
            gl.glReadPixels(point.x, viewport[3]-point.y, 1, 1, gl.GL_RGBA, gl.GL_FLOAT, fb);
            processGLError(gl, gl.glGetError());
     
            float[]color = new float[4];
            for(int k=0; k<color.length; k++){
                color[k] = fb.get(k);
            }
     
            for(int k=0; k<4; k++){
                System.out.print(color[k]+"\t");
            }
            System.out.println();
     
            if(color[3]==1f){
                selected = searchNodeColor(color);
                System.err.println("Node="+selected);
                if(selected!=-1){
                    setNeighbors();
                    node_modified=true;
                }
            }
            else{
                e_selected = searchEdgeColor(color);
                System.err.println("Edge="+e_selected);
            }
     
            this.mouse_state = this.RELEASED;
        }
    Voici maintenant les valeurs de mes tables pour un réseau constitué de 2 noeuds et un lien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    falseColorNodes:
    [0]=>{0.003921569, 0, 0, 1}
    [1]=>{0.003921569, 0.003921569, 0, 1}
    falseColorEdges:
    [0]=>{0.003921569, 0, 0,  0.39215687}
    Et voici ce que je récupère lors d'un clic sur le lien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    0.65882355	0.65882355	0.65882355	1.0
    Bizarre comme valeur pour le lien ! Et ça correspond pas du tout au background qui a pour couleur 1, 1, 1, 1.
    Y aurait il un problème dans mon glReadPixels ?

    Merci d'avance de votre aide.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  2. #2
    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
    je ne suis pas certain de bien comprendre, aussi rassures moi, tu n'utilises pas de valeur alpha dans ton process de color picking n'est-ce pas ?
    parceque l'alpha d'une couleur est modulée avec un pixel à l'écran, tu ne la retrouvera pas, l'alpha va altérer la couleur finale avec la couleur source

    de plus, ton readpixels pour récupérer la couleur d'un picking, tu ne dois pas le faire en réels mais en entiers (GL_UNSIGNED_BYTE) sous peine de problème avec la précision

    préviens moi si je n'ai pas compris ton code

    edit : pour résumer, en color picking tu appliques une couleur à partir des 3 composantes RGB (avec glColor3ub ou glColor3ubv) pour récupérer une couleur sur 3 composantes RGB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gl.glReadPixels(point.x, viewport[3]-point.y, 1, 1, gl.GL_RGB, gl.GL_UNSIGNED_BYTE, fb);
    en prenant soin de changer fb en buffer de "unsigned char"
    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.

  3. #3
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 895
    Par défaut
    Salut Shenron

    En fait, tu viens de m'apprendre quelque chose: le fait de NE PAS UTILISER de valeurs alpha.
    Or, c'est ce que je faisais pour les liens
    Bon, je n'ai plus qu'à reconsidérer mon tableau de fausses couleurs pour les liens
    Merci Shenron.
    Je laisse le thread ouvert pour le cas où.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  4. #4
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 895
    Par défaut
    Bonjour

    Juste un complément. Je vais donc tout porter en byte. Le problème sera comment trouver un moyen de dissocier noeud et lien lors du picking vu que les vecteurs de ces 2 types d'objets sont construits de la même manière Bref, j'ai encore du pain sur la planche....

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  5. #5
    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
    avec les unsigned byte tu as tout de même 256 * 256 * 256 = 16777216 valeurs possibles, tu peux définir une plage de valeurs pour tes noeuds et une autre plage pur tes liens ou alors tu peux définir un identifiant ou un index pour chacun de tes noeuds et liens et à partir de cet identifiant retrouver l'objet et donc son type

    tiens pendant que j'y pense, j'ai testé le picking (pas par color, le picking GL_SELECT) sur ma machine au boulot, équipée d'un GMA3000 intel, drivers à jour, marche pas, il capte jamais les noms
    le même programme marche sur ma geforce à la maison
    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.

  6. #6
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 895
    Par défaut
    Salut Shenron

    Merci de tes conseils. Je suis d'accord avec ton calcul. Sauf que je divise par deux
    La moitié pour les noeuds, la moitié pour les edges. Mes premiers tests me semblent corrects
    Donc, merci encore à toi de m'avoir enseigné qu'il ne faut pas utiliser de valeur alpha lors du Color Picking

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

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

Discussions similaires

  1. [JOGL] Problème avec glTranslatef(x, y, z)
    Par VonDriguen dans le forum 3D
    Réponses: 6
    Dernier message: 22/02/2013, 10h13
  2. Problème avec la lumière (jogl:opengl)
    Par Alays dans le forum OpenGL
    Réponses: 4
    Dernier message: 31/10/2012, 13h12
  3. Problème avec la lumière (jogl:opengl)
    Par Alays dans le forum Général Java
    Réponses: 2
    Dernier message: 29/10/2012, 17h48
  4. [jogl]Problème avec TextRenderer
    Par Knightmare dans le forum 3D
    Réponses: 4
    Dernier message: 01/06/2007, 09h52
  5. Problème avec glReadPixels
    Par BruceBoc dans le forum OpenGL
    Réponses: 2
    Dernier message: 22/08/2006, 11h15

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