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 :

glReadPixels


Sujet :

OpenGL

  1. #1
    Membre éclairé
    Inscrit en
    Mars 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 84
    Par défaut glReadPixels
    Je veux juste recupere ou la personne clic pour savoir si elle a clicke sur un objet. Mais ca decale sur ma machine et pas sur celle d' un autre, c a dire que sur ma machine, je dois clicke en bas a droite pour selectionne un objet au milieu.

    Donc si vous pouviez tester pour savoir si ca marche chez vous, ca serait sympa et si en plus vous trouvez l'erreur ca serait encore plus sympa

    Merci d' avance


    voici le code : je l' ai simplifie au plus simple :

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    #include <GL/glut.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
    float ratio;
     
     
    #include <iostream.h>
    static void setup_opengl( int width, int height )
    {	
        ratio = (float) width / (float) height;
     
        glShadeModel( GL_SMOOTH );		    
        glPolygonMode(GL_FRONT,GL_FILL);
     
     
        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GL_LESS);
     
     
        glMatrixMode( GL_PROJECTION );
        glLoadIdentity( );
     
        gluPerspective( 60.0, ratio, 1, 10000.0 );
    	glMatrixMode( GL_MODELVIEW );
    	glLoadIdentity();
    }
     
     
    void renderScene(void) 
    {glReadBuffer(GL_FRONT);
    	glClearColor( 0.0f, 0.0f, 0.0f, 1 );
     
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
    		gluLookAt(0.,0.,50,0.,0.,0.,0.,1.,0.);
    		glTranslatef(-10.,0.,0.);
    		glutSolidCube(10);
    		unsigned char  *pixel=new unsigned char[18];
    		*pixel=20;
    		*(pixel+1)=20;
    		*(pixel+2)=20;
    		*(pixel+3)=20;
    	glutSwapBuffers();
    }
     
     
    void MouseFunc(int button, int state,int x, int y){
    	glClearColor( 1.0f, 0.0f, 0.0f, 1 );
     	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
    	glMatrixMode(GL_MODELVIEW);
    		glLoadIdentity();
     
    		gluLookAt(0.,0.,50,0.,0.,0.,0.,1.,0.);
    glTranslatef(-10.,0.,0.);
    		glutSolidCube(10);
     
    cerr<<"SELECTION\n";
     
    		unsigned char  *pixel=new unsigned char[18];
    		*pixel=20;
    		*(pixel+1)=20;
    		*(pixel+2)=20;
    		*(pixel+3)=20;
     
    	glFinish();
     
     
    	glReadBuffer(GL_BACK);
    	glReadPixels(x,480-y,2,2,GL_RGB,GL_UNSIGNED_BYTE,pixel);
    	glFinish();
    		cerr<<x<<" "<<480-y<<" pix: "<<(int)(*(pixel++))<<" "<<(int)(*(pixel++))<<" "<<(int)(*(pixel++))<<endl;
    }
     
     
     
    int main (int argc, char * * argv){
     
    	glutInit(&argc, argv);
    	glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    	glutInitWindowPosition(100,350);
    	glutInitWindowSize(640,480);
    	glutCreateWindow("COUCOU");
    	setup_opengl(640,480);
     
     
    	glutDisplayFunc(renderScene);
    	glutMouseFunc(MouseFunc);
     
    	glutMainLoop();
     
    	return 0;
    }

  2. #2
    Nouveau membre du Club
    Inscrit en
    Avril 2002
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 9
    Par défaut
    Pourquoi tu utilises pas plutot les fonctions opengl gluProject et gluUnproject qui te permettent de savoir ou tu as clique en 3d sur ton ecran 2d ( comme c est assez complique je te conseille ces tuts sur la realisation d un modeleur 3d :

    http://membres.lycos.fr/jcomgl/ogl.php3

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 27
    Par défaut Mode Sélection
    Il existe justement des fonctions Opengl (autres que gluUnProject ) pour trouver sur quels objets l'utilisateur clique. Il faut passer en mode Sélection
    glRenderMode(GL_SELECT);
    Pour plus d'infos , je te conseilles d'aller voir le site de Nehe (une mine d'or)
    http://nehe.gamedev.net/
    La leçon traitant du mode Selection est la leçon 32 (picking)
    http://nehe.gamedev.net/tutorials/lesson.asp?l=32

    http://nehe.gamedev.net/tutorials/vc/lesson32.zip ici source et exécutable...
    A+

  4. #4
    Membre éclairé
    Inscrit en
    Mars 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 84
    Par défaut
    Toutes vos methodes sont valables (j y avais pense), mais ne sont pas adapte parfaitement a la situation. En fait je crois que ma methode est la plus rapide mais elle ne marche pas sur tous les pc. Etrange ...

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 27
    Par défaut
    En tout cas ta méthode marche chez moi : ça affiche un rectangle blanc et dans le fenêtre Dos tu as les coordonnés du point sur lequel t'as cliqué dans la fenêtre Windows.

  6. #6
    Membre éclairé
    Inscrit en
    Mars 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 84
    Par défaut
    Merci a tous mais je viens de trouve :

    ....C un bug!...

    ...Ca marche pas quand , sur des cartes ATI, on active l'anti-aliasing ....

    ....Etrange ....

    ...Mais c comme ca....

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 27
    Par défaut
    Hihi ATI suks

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

Discussions similaires

  1. screenshot avec glReadPixels
    Par j_p_g dans le forum OpenGL
    Réponses: 4
    Dernier message: 20/11/2006, 19h28
  2. glReadPixels() et GL_DEPTH_COMPONENT
    Par olix2007 dans le forum OpenGL
    Réponses: 2
    Dernier message: 06/11/2006, 13h24
  3. Problème avec glReadPixels
    Par BruceBoc dans le forum OpenGL
    Réponses: 2
    Dernier message: 22/08/2006, 11h15
  4. Réponses: 3
    Dernier message: 15/07/2006, 05h18
  5. Problème avec glReadPixels
    Par breton51 dans le forum OpenGL
    Réponses: 14
    Dernier message: 10/02/2006, 17h00

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