views:

104

answers:

2

I want to change background color of the window after pressing the button, but my program doesn't work, can somebody tell me why, thanks in advance

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;
    }
A: 

I would imagine you don't have an OpenGL context at that point that you call glClearColor.

But...

...I've never used glut before so a quick look at the docs suggests that you will actually have a context after glutCreateWindow so perhaps that's not it.

As my comment on your question says I'm curious about the second call to glClearColor and how you think you will reach it. That's more likely the cause of the problem. To do anything on a key press I believe you would have to register a callback using glutKeyboardFunc.

Troubadour
@Troubadour: sorry, but I didn't understand, I'm beginner
lego69
I'm workin in Eclipse
lego69
+2  A: 

glClearColor does not do any clearing itself -- it just sets what the color will be when you do actually clear. To do the clearing itself, you need to call glClear with (at least) COLOR_BUFFER_BIT.

Edit: it's been quite a while since I used glut, so the details of this could be wrong, but if memory serves, to change the screen color in response to pressing a key on the keyboard, you'd do something like this:

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

Basically, you do all your drawing in whatever function you pass to glutDisplayFunc. Almost anything else just changes the state, then calls PostRedisplayFunc(); to tell glut that the window needs to be redrawn. Warning: as I said, it's been a while since I used glut and I haven't tested this code. It shows the general structure of a glut program to the best of my recollection, but don't expect it to work exactly as-is.

Jerry Coffin
@Jerry Coffin: I did it,but it still doesn't work, may be problem with glutMainLoop?
lego69
This solution is fine. Try using double buffer? glutMainLoop is fine. Tell me if it works with double buffering
Ram Bhat