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 :

glClearColor et glClear


Sujet :

OpenGL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 32
    Points : 14
    Points
    14
    Par défaut glClearColor et glClear
    Bonjour à tous,

    Ma situation est :
    - Charger les données
    - Draw la scène
    - Modifier les données (1)
    - Re-draw la scène --> retourner à (1)


    Dans la fonction DrawScène, si j’utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glClearColor        (0.f,0.f,0.f,1.f);
    , la scène est bien draw, mais si j’utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    , je ne vois rien sur l’écran.

    Mais si j’utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glClearColor        (0.f,0.f,0.f,1.f);
    , quand j’appelle re-draw la scène, la ne mis à jour pas.

    Je ne sais pas pour quoi.

    Merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    la fonction glclear permet de nettoyer les buffers. Pus précisément,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    nettoie le color buffer (l'écran) avec les valeurs précisées par glClearColor. De même pour le depth buffer (fonction glClearDepth).

    En fait, tu appelles une seule fois glClearColor (dans une fonction init par exemple) et ensuite a chaque draw, tu appelles glClear qui initialisera les buffers désignés.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 32
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par crischprolch Voir le message
    la fonction glclear permet de nettoyer les buffers. Pus précisément,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    nettoie le color buffer (l'écran) avec les valeurs précisées par glClearColor. De même pour le depth buffer (fonction glClearDepth).

    En fait, tu appelles une seule fois glClearColor (dans une fonction init par exemple) et ensuite a chaque draw, tu appelles glClear qui initialisera les buffers désignés.
    Oui, mais pourquoi je peux voir la scène avec glClearColor
    mais je ne voir rien avec glClear?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    tout simplement parce que glClearColor permet de dire à quelle valeur doit être initialisé l'écran tandis que glClear s'occupe d'initialiser l'écran. Pour résumer, la première permet de déclarer tandis que la deuxième effectue le travail.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 32
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par crischprolch Voir le message
    tout simplement parce que glClearColor permet de dire à quelle valeur doit être initialisé l'écran tandis que glClear s'occupe d'initialiser l'écran. Pour résumer, la première permet de déclarer tandis que la deuxième effectue le travail.
    donc si j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glClearColor        (0.f,0.f,0.f,1.f);
    glClear(GL_COLOR_BUFFER_BIT);
    je ne vois rien aussi.

    Pouvez vous préciser le code que je dois utiliser si je veux nettoyer l'écran et re-draw ma scène.

  6. #6
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 162
    Points : 172
    Points
    172
    Par défaut
    bah tu fais glClearColor(...) une fois au lancement du programme pour definir la couleur d'arrier plan
    puis à chaque fois que tu veux redessiner tu appel glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    et tu met juste apres le code qui affiche la scene.

    par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void draw()
    {
       glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
       glBegin(GL_TRIANGLES);
          glVertex3f(0f,0f,0f);
          glVertex3f(0f,1f,0f);
          glVertex3f(1f,0f,0f);
       glEnd();
    }

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    en effet, tout simplement comme cela

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 32
    Points : 14
    Points
    14
    Par défaut
    J'ai une fonction et il marche bien:

    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
    void Viewer::drawScence(){
        glClearColor        (0.f,0.f,1.0f,1.f);
        glMatrixMode        (GL_PROJECTION);
        glFrustumf (-1000.f,1000.f,-1000.f,1000.f,3.f,1000.f);
     
        glMatrixMode        (GL_MODELVIEW);
        glShadeModel        (GL_SMOOTH);
        glEnableClientState (GL_VERTEX_ARRAY);
     
     
        glTranslatef            (0,0,-5.f);
     
        glColor4f(0,1,0,1);
     
    	static const GLfloat vertices[3 * 3] =
    	{
    	     -1000,    1000,    0,
    	      1000,   -1000,    0,
    	      1000,    1000,    0
    	};
     
    	static const GLubyte colors[3*4] = {
    			255, 0, 0, 255,
    			0, 255, 0, 255,
    			0, 0, 255, 255
    	};
     
        glVertexPointer( 3, GL_FLOAT, 0, vertices );
     
        glDrawArrays( GL_LINES, 0, 2);
    }


    Mais si j'ajoute une ligne (glClear) , il ne marche plus

    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
    void Viewer::drawScence(){
        glClearColor        (0.f,0.f,1.0f,1.f);
    glClear(GL_COLOR_BUFFER_BIT);
        glMatrixMode        (GL_PROJECTION);
        glFrustumf (-1000.f,1000.f,-1000.f,1000.f,3.f,1000.f);
    
        glMatrixMode        (GL_MODELVIEW);
        glShadeModel        (GL_SMOOTH);
        glEnableClientState (GL_VERTEX_ARRAY);
    
        
        glTranslatef            (0,0,-5.f);
        
        glColor4f(0,1,0,1);
    
    	static const GLfloat vertices[3 * 3] =
    	{
    	     -1000,    1000,    0,
    	      1000,   -1000,    0,
    	      1000,    1000,    0
    	};
    	
    	static const GLubyte colors[3*4] = {
    			255, 0, 0, 255,
    			0, 255, 0, 255,
    			0, 0, 255, 255
    	};
    
        glVertexPointer( 3, GL_FLOAT, 0, vertices );
        
        glDrawArrays( GL_LINES, 0, 2);
    }

    Pour quoi?

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    quand appelles-tu ta fonction draw_scene ?

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 32
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par crischprolch Voir le message
    quand appelles-tu ta fonction draw_scene ?
    Je ne sais pas si vous connaissez Symbian ou non. Dans le constructeur : ConstructL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void Viewer::ConstructL(){
    iPeriodic = CPeriodic::NewL( CActive::EPriorityIdle );         // Create an active object for
                                                                      // animating the scene
    iPeriodic->Start( 100, 100, TCallBack( Viewer::DrawCallBack, this ) );
    }

    Dans la fonction : DrawCallBack:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TInt Viewer::DrawCallBack( TAny* aInstance ){
    instance->drawScence();
    }
    En résumé : la fonction drawScene sera appelée toutes les secondes.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 32
    Points : 14
    Points
    14
    Par défaut
    C'est bon maintenant

    merci à tous,

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 183
    Points
    5 183
    Par défaut
    pourrais-tu préciser comment tu as résolu le problème ?
    de manière à ce que si d'autres rencontrent le même soucis ils pourront se fier à ton expérience
    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.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 32
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    pourrais-tu préciser comment tu as résolu le problème ?
    de manière à ce que si d'autres rencontrent le même soucis ils pourront se fier à ton expérience
    Je pense qu'à la cause de l'ordre des fonctions (On met la fonction glClear avant ou après autres fonctions).

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

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