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

3D Java Discussion :

[JOGL] glReadPixel ?


Sujet :

3D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Points : 16
    Points
    16
    Par défaut [JOGL] glReadPixel ?
    Ben j'ai un p'tit problème avec glReadPixel, je voudrais récupérer la couleur (en float si possible) du pixel ou j'ai cliqué, j'ai cherché sur des dizaines de sites, mais j'ai l'impression que personne utilise cette fonction avec du java XD
    Voilà le bout de code correspondant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ByteBuffer buffer = BufferUtils.createByteBuffer(4);
    gl.glReadPixels(mouse_x, mouse_y,1,1,GL.GL_RGBA,GL.GL_UNSIGNED_BYTE, buffer);
    System.out.println(buffer.toString());
    Et ben en résultat, ça me donne ça :
    java.nio.DirectByteBuffer[pos=0 lim=4 cap=4]

    Je récupère les bonnes coordonnées de souris, donc je sais pas ce qui pose problème. J'ai essayé pas mal de trucs différents, mais je sais pas ce qui va pas :/

  2. #2
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par Clilmbatize
    Et ben en résultat, ça me donne ça :
    java.nio.DirectByteBuffer[pos=0 lim=4 cap=4]
    Ben tu appelles toString(), il te sort une String... logique...
    Si tu veux un float, faut pas demander à ce qu'il te le donne en String...
    A vue de Javadoc, ça serait plutôt un getFloat()... et encore, même pas sûr qu'il te sorte la bonne valeur... à vérifier... sinon il faudra coder la méthode qui va bien...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Bon ben je vais reformuler alors, j'ai essayé avec d'autres trucs, que je mettent juste buffer (là ça me donne la même chose que buffer.toString()) ou buffer.getFloat (là ça m'affiche NaN), c'était juste pour voir si je récupérais la bonne chose, je me doute que je vais pas récupérer un float en mettant toString -_-
    Ma question c'était plutôt est-ce que j'utilise la fonction comme il faut ? C'est bien un buffer (FloatBuffer ici) qu'il faut mettre en dernier ? Et si c'est pas ça, ben faut mettre quoi ?
    Et pendant que j'y suis, c'est quoi cette méthode qui va bien dont tu parles ?

    edit : j'viens de voir que j'ai mis un ByteBuffer dans l'exemple de code, désolé :/, mais j'avais testé avec les Float, ça passait pas non plus.

  4. #4
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 17
    Points : 139
    Points
    139
    Par défaut glPixelStorei
    Bonjour,

    De mon coté, j'ai utilisé cette méthode plusieurs fois et cela marche tres bien.

    Par contre, a chaque fois je spécifie le mode de stockage des pixels :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    gl.glPixelStorei(GL.GL_PACK_ALIGNMENT, 1);
    ByteBuffer bytes = ByteBuffer.wrap(rasterData);
    bytes.order(ByteOrder.nativeOrder());
    gl.glReadPixels( 0, renderingInformations.getViewHeight() - h, w, h, GL.GL_BGR, GL.GL_UNSIGNED_BYTE, bytes);

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Merci, j'ai testé, mais j'pense que je dois tout simplement être mauvais^^
    J'ai essayé d'adapter à mon code, ça donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    gl.glPixelStorei(GL.GL_PACK_ALIGNMENT, 1);
    byte[] rasterdata = new byte[3];
    ByteBuffer buffer = ByteBuffer.wrap(rasterdata);
    buffer.order(ByteOrder.nativeOrder());
    gl.glReadPixels(mouse_x, viewPort[3]-mouse_y,1,1,GL.GL_RGB,GL.GL_UNSIGNED_BYTE, buffer);
    System.out.println(buffer.get());
    Je savais pas ce que c'était rasterdata, alors comme j'ai vu que pour wrap il fallait un byte[], ben j'en ai fait un
    Et ben ça m'affiche -1 :/

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Bah encore une fois j'ai finalement réussi par trouver une méthode qui marche^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int[] viewPort1 = new int[4];
    gl.glGetIntegerv(GL.GL_VIEWPORT, viewPort1,0);
    gl.glReadBuffer(GL.GL_FRONT);
    FloatBuffer buffer = FloatBuffer.allocate(3);
    gl.glReadPixels(mouse_x, viewPort1[3]-mouse_y, 1, 1, GL.GL_RGB, GL.GL_FLOAT, buffer);
    float[] pixels = new float[3];
    pixels = buffer.array();
    System.out.println(pixels[0]+" "+pixels[1]+" "+pixels[2]);
    Merci pour ceux qui ont essayé de m'aider, et j'espère que ça aidera des gens aussi

  7. #7
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 17
    Points : 139
    Points
    139
    Par défaut autres méthodes
    une autre méthode qui a son rôle est aussi : qui spécifie dans quel buffer lire les données...

    Sinon je pense qu'il faut chercher sur ton objet GL et sa synchro (gl.glFlush() ?)

    et éventuellement un test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int error = gl.glGetError();
    if (error != GL.GL_NO_ERROR){
       // une erreur est survenue
       GLU glu = new GLU();
       System.err.println(glu.gluErrorString(error));
    }

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

Discussions similaires

  1. [jogl]Problème avec glReadPixels
    Par GLDavid dans le forum OpenGL
    Réponses: 8
    Dernier message: 13/01/2009, 15h20
  2. Rapidité de JOGL
    Par joseph_p dans le forum OpenGL
    Réponses: 3
    Dernier message: 18/03/2005, 07h56
  3. [java] java3d vs Jogl
    Par mandale dans le forum OpenGL
    Réponses: 3
    Dernier message: 03/01/2005, 15h44
  4. [Debutant Java JOGL] problème glVertexPointer()
    Par Stef784ever dans le forum OpenGL
    Réponses: 2
    Dernier message: 21/04/2004, 17h43
  5. glReadPixels
    Par exxos dans le forum OpenGL
    Réponses: 6
    Dernier message: 15/05/2002, 21h37

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