2011-05-22 19 views
6

Aquí hay un programa opengl simple de mi parte. Estoy tratando de borrar la pantalla antes de dibujar un triángulo. He llamado a glClear() en mi función init(), sin embargo, parece que no ha podido borrar la pantalla.¿Por qué glClear no borra mi pantalla?

#include <stdio.h> 
#include <stdlib.h> 
#include <GL/gl.h> 
#include <GL/glu.h> 
#include <GL/glut.h> 

void myIdleFunc() 
{ 
    glBegin(GL_TRIANGLES); 
    { 
     glColor3f(1.0f, 1.0f, 1.0f); 
     glVertex2f(0.0f, 1.0f); 
     glVertex2f(-1.0f, -1.0f); 
     glVertex2f(1.0f, -1.0f); 
    } 
    glEnd(); 

    glFlush(); 

    usleep(1000000); 
} 

void init() 
{ 
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glFlush(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE); 
    glutCreateWindow("Hello, World!"); 

    init(); 

    glutIdleFunc(myIdleFunc); 
    glutMainLoop(); 
    return 1; 
} 

Aquí hay una captura de pantalla, el texto es del terminal gnome en el fondo.

enter image description here

+8

Que en realidad se ve muy bonito. Tal vez deberías dejarlo así :) –

Respuesta

4

¿Dónde está su devolución de llamada pantalla? No debe usar la función inactiva para dibujar.

Todo el dibujo debe tener lugar en las devoluciones de llamada apropiadas, el contexto GL podría no estar activo hasta que glutMainLoop comience a ejecutarse, y sin contexto activo, sus comandos simplemente serán ignorados (sin contexto, puede que ni siquiera haya un lugar para almacenar errores para recuperación con glGetError).

NOTA: Por lo general, desea borrar el búfer al comienzo de cada fotograma. Puede salirse con la limpieza solo una vez con el almacenamiento en búfer único, pero el doble almacenamiento en búfer es mejor y requiere que de alguna manera represente toda el área entre cada intercambio.

+0

Gracias. ¿Por qué no usar la función inactiva para dibujar? Quiero decir que necesito dibujar repetidamente este triángulo. ¿La función de pantalla no está dibujando cuando no ocurre nada en particular? – trVoldemort

+0

@tr: No sé, no uso GLUT. Pero el código que está fallando no está en ninguna devolución de llamada, es antes de que GLUT haya comenzado su ciclo, por lo que GL puede no estar listo para usar. –

+0

El contexto se crea y se activa en glutCreateWindow y no en glutMainLoop. Entonces su código funciona (pero no como él pretendía). –

0

No consumo GLUT sino una manera muy sencilla de mostrar algo como esto es:

while(!done) { /* Loop until done. Do drawing. */  

    glClear(GL_COLOR_BUFFER_BIT); 
    glLoadIdentity(); 

    glBegin(GL_TRIANGLES); 
    { 
     glColor3f(1.0f, 1.0f, 1.0f); 
     glVertex2f(0.0f, 1.0f); 
     glVertex2f(-1.0f, -1.0f); 
     glVertex2f(1.0f, -1.0f); 
    } 
    glEnd(); 

    glFlush(); 
    SwapBuffers(); 

    etc... event handling.... 
} 
1

Su problema es que lo hace limpiar la pantalla en su código de inicialización. Pero debe borrar cada fotograma, por lo tanto, al inicio de la función de pantalla (o en su caso inactivo).

0

Ejecute este código y probablemente obtendrá la solución.

#include<GL/gl.h> 
#include<GL/glut.h> 
#include<stdio.h> 

double x_0 = -100; 
double y_0 = -25; 

double x_1 = 100; 
double y_1 = -25; 

double x_2 = 100; 
double y_2 = 25; 

double x_3 = -100; 
double y_3 = 25; 

void 
init(void) 
{ 
    /*initialize the x-y co-ordinate*/ 
    glClearColor(0,0,0,0); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(-320, 319,-240, 239); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glFlush(); 
} 

void 
drawRectangle() 
{ 
    glBegin(GL_LINES); 

    glVertex2d(x_0, y_0); 
    glVertex2d(x_1, y_1); 

    glVertex2d(x_1, y_1); 
    glVertex2d(x_2, y_2); 

    glVertex2d(x_2, y_2); 
    glVertex2d(x_3, y_3); 

    glVertex2d(x_3, y_3); 
    glVertex2d(x_0, y_0); 

    glEnd(); 
    glFlush(); 
} 

int 
main(int argc, char *argv[]) 
{ 
    double x_0, y_0, x_1, y_1; 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize(640, 480); 
    glutInitWindowPosition(400, 400); 

    glutCreateWindow("Clear Screen"); 
    init(); 
    drawRectangle(); 
    /* clear the screen. You can uncomment following three lines to view the effect of clearing */ 
// glClearColor(0, 0, 0, 0); 
// glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
// /* don't forget to flush */ 
// glFlush(); 
    /***/ 
    glutMainLoop(); 
} 

compilar y ejecutar -

gcc file.c -lglut -lGLU -lGL 
./a.out 
Cuestiones relacionadas