2010-05-24 9 views
8

Ich möchte nach dem Drücken der Taste Hintergrundfarbe des Fensters ändern, aber mein Programm nicht funktioniert, kann mir jemand sagen, warum, danke im vorausHintergrundfarbe in 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

Nach dem Drücken von "Was Knopf"? – tafa

+0

Seit 'glutMainLoop()' wird nie zurückkommen, wie erwarten Sie zu Ihrer 'System (" pause ") Anweisung und dem zweiten' glClearColor' Aufruf zu kommen? – Troubadour

+0

@tafa: Wie kann ich meinen Code ändern, um diesen Effekt zu sehen? – lego69

Antwort

17

glClearColor löscht sich nicht selbst - es stellt nur die Farbe ein, wenn Sie tatsächlich löschen. Um das Clearing selbst durchzuführen, müssen Sie glClear mit (mindestens) COLOR_BUFFER_BIT aufrufen.

Edit: Es ist schon eine Weile her, seit ich überschwemmt habe, so dass die Details falsch sein könnten, aber wenn Speicher dient, um die Bildschirmfarbe als Reaktion auf eine Taste auf der Tastatur zu ändern, würden Sie etwas tun dies wie:

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(); 
} 

Grundsätzlich haben Sie alle Ihre Zeichnung in welcher Funktion, die Sie glutDisplayFunc passieren. Fast alles andere ändert nur den Zustand und ruft dann PostRedisplayFunc(); an, um zu sagen, dass das Fenster neu gezeichnet werden muss. Warnung: Wie gesagt, es ist schon eine Weile her, seit ich das Überangebot benutzt habe und diesen Code nicht getestet habe. Es zeigt die allgemeine Struktur eines Überschwemmungsprogramms nach bestem Wissen meiner Erinnerung, aber erwarte nicht, dass es genau so funktioniert wie es ist.

+0

Ich habe es getan, aber es funktioniert immer noch nicht, möglicherweise ein Problem mit glutMainLoop? – lego69

+0

Diese Lösung ist in Ordnung. Versuchen Sie es mit Doppelpuffer? glutMainLoop ist in Ordnung. Sag mir, ob es mit Doppelpufferung funktioniert – Laz

0

Ich könnte mir vorstellen, Sie don An dieser Stelle haben Sie keinen OpenGL-Kontext, den Sie glClearColor aufrufen.

Aber ...

... Ich habe Schwemme nie benutzt, bevor so ein kurzer Blick auf die docs schlägt vor, dass Sie tatsächlich einen Zusammenhang haben nach glutCreateWindow so vielleicht ist das nicht.

Wie mein Kommentar zu Ihrer Frage sagt, bin ich neugierig auf den zweiten Anruf an glClearColor und wie Sie denken, dass Sie es erreichen werden. Das ist wahrscheinlich die Ursache des Problems. Um etwas bei einem Tastendruck zu tun, glaube ich, dass Sie einen Rückruf mit glutKeyboardFunc registrieren müssen.

+0

Sorry, aber ich habe nicht verstanden, ich bin Anfänger – lego69

+0

Ich arbeite in Eclipse – lego69