2010-05-24 90 views
8

Quiero cambiar el color de fondo de la ventana después de pulsar el botón, pero mi programa no funciona, puede alguien decirme por qué, gracias por adelantadocolor de fondo en 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

Después de presionar "¿qué botón"? – tafa

+0

Dado que 'glutMainLoop()' nunca volverá ¿cómo esperas llegar a tu declaración 'system (" pause ")' y la segunda llamada 'glClearColor'? – Troubadour

+0

@tafa: ¿cómo puedo cambiar mi código para ver este efecto? – lego69

Respuesta

17

glClearColor no hace ningún aclarado en sí mismo, simplemente establece cuál será el color cuando realmente se borre. Para hacer la limpieza en sí, debe llamar al glClear con (al menos) COLOR_BUFFER_BIT.

Editar: Ha pasado bastante tiempo desde que usé exceso, así que los detalles de esto podrían ser incorrectos, pero si la memoria sirve, para cambiar el color de la pantalla en respuesta a presionar una tecla en el teclado, harías algo de esta manera:

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

Básicamente, haces todo su dibujo en función de lo que sea que pase a glutDisplayFunc. Casi todo lo demás simplemente cambia el estado, luego llama al PostRedisplayFunc(); para indicar que hay que volver a dibujar la ventana. Advertencia: como dije, ha pasado un tiempo desde que usé exceso y no he probado este código. Muestra la estructura general de un programa de exceso a lo mejor de mi recuerdo, pero no esperes que funcione exactamente como está.

+0

Lo hice, pero todavía no funciona, ¿podría haber un problema con glutMainLoop? – lego69

+0

Esta solución está bien. Intenta usar doble buffer? glutMainLoop está bien. Dime si funciona con doble buffering – Laz

0

Me imagino que Don No tiene un contexto OpenGL en ese punto que llame al glClearColor.

Pero ...

... nunca he utilizado exceso antes de lo que un rápido vistazo a la docs sugiere que usted realmente va a tener un contexto después de glutCreateWindow así que quizás eso no es todo.

Como mi comentario sobre su pregunta dice que tengo curiosidad acerca de la segunda llamada al glClearColor y cómo cree que lo alcanzará. Esa es más probable la causa del problema. Para hacer algo al presionar una tecla, creo que debería registrar una devolución de llamada usando glutKeyboardFunc.

+0

lo siento, pero no entendí, soy principiante – lego69

+0

Estoy trabajando en Eclipse – lego69