2010-05-24 9 views
8

Je veux changer la couleur de fond de la fenêtre après avoir appuyé sur le bouton, mais mon programme ne fonctionne pas, quelqu'un peut me dire pourquoi, merci à l'avancecouleur de fond dans opengl

int main(int argc, char* argv[]) 
    { 
     glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 
     glutInitWindowSize(800, 600); 
     glutInitWindowPosition(300,50); 
    glutCreateWindow("GLRect"); 

glClearColor(1.0f, 0.0f, 0.0f, 1.0f); <--- 

    glutDisplayFunc(RenderScene); 
     glutReshapeFunc(ChangeSize); 
    glutMainLoop(); 

    system("pause"); 
glClearColor(0.0f, 1.0f, 0.0f, 1.0f); <--- 

     return 0; 
    } 
+0

Après avoir appuyé sur "quel bouton"? – tafa

+0

Puisque 'glutMainLoop()' ne retournera jamais, comment voulez-vous arriver à l'instruction 'system (" pause ")' et au second appel 'glClearColor'? – Troubadour

+0

@tafa: comment puis-je changer mon code pour voir cet effet? – lego69

Répondre

17

glClearColorglClearColor ne fait pas d'effacement lui-même - il définit simplement ce que la couleur sera lorsque vous effacez réellement. Pour faire la compensation lui-même, vous devez appeler glClear avec (au moins) COLOR_BUFFER_BIT.

Edit: ça fait longtemps que j'ai utilisé la surabondance, donc les détails peuvent être faux, mais si ma mémoire est bonne, pour changer la couleur de l'écran en appuyant sur une touche du clavier, tu ferais quelque chose comme ceci:

void keyboard (unsigned char key, int x, int y) 
{ 
    // we'll switch between red and blue when the user presses a key: 
    GLfloat colors[][3] = { { 0.0f, 0.0f, 1.0f}, {1.0f, 0.0f, 0.0f } }; 
    static int back; 

    switch (key) { 
    case 27: 
     exit(0); 
    default: 
     back ^= 1; 
     glClearColor(colors[back][0], colors[back][1], colors[back][2], 1.0f); 
     glutPostRedisplay(); 
    } 
} 

void draw() { 
    glClear(GL_COLOR_BUFFER_BIT); 
    // other drawing here... 
} 

int main() { 

    // glutInit, glutInitDisplayMode, etc. 

    glutDisplayFunc(draw); 
    glutKeyboardFunc(keyboard); 
    glutMainLoop(); 
} 

Fondamentalement, vous faites tout votre dessin quelle que soit la fonction que vous passez à glutDisplayFunc. Presque tout le reste change juste l'état, puis appelle PostRedisplayFunc(); pour indiquer que la fenêtre doit être redessinée. Attention: comme je l'ai dit, ça fait longtemps que j'ai utilisé la surabondance et je n'ai pas testé ce code. Il montre la structure générale d'un programme de surabondance au meilleur de mes souvenirs, mais ne vous attendez pas à ce qu'il fonctionne exactement tel quel.

+0

Je l'ai fait, mais cela ne fonctionne toujours pas, peut-être un problème avec glutMainLoop? – lego69

+0

Cette solution est correcte. Essayez d'utiliser un double tampon? glutMainLoop va bien. Dites-moi si cela fonctionne avec le double tampon – Laz

0

Je vous imagine don N'avez pas de contexte OpenGL à ce point que vous appelez glClearColor.

Mais ...

... Je ne l'ai jamais utilisé avant rassasiement donc un coup d'œil sur l'docs suggère que vous allez réellement avoir un contexte après glutCreateWindow donc peut-être que ce pas.

Comme mon commentaire sur votre question dit que je suis curieux au sujet du deuxième appel à glClearColor et comment vous pensez que vous l'atteindrez. C'est plus probablement la cause du problème. Pour faire quoi que ce soit sur une touche, je crois que vous devriez enregistrer un rappel en utilisant glutKeyboardFunc.

+0

désolé, mais je ne comprenais pas, je suis débutant – lego69

+0

Je travaille dans Eclipse – lego69