为什么glClear不清除我的屏幕?

时间:2011-05-22 03:14:31

标签: c opengl

这是一个简单的opengl程序。在绘制三角形之前,我正试图清除屏幕。我在我的init()函数中调用了glClear(),但它似乎无法清除屏幕。

#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;
}

这是一个屏幕截图,文字来自后台的gnome终端。

enter image description here

4 个答案:

答案 0 :(得分:4)

你的显示器回调在哪里?您不应该使用idle函数进行绘制。

所有绘图都需要在适当的回调中进行,GL上下文在glutMainLoop开始运行之前可能不会处于活动状态,并且在没有活动上下文的情况下,您的命令会被忽略(没有上下文,甚至可能没有是一个存储错误的地方,可以使用glGetError)进行检索。

注意:通常您希望在每帧的开头清除缓冲区。你可以通过单缓冲清除一次,但双缓冲更好,并且需要你以某种方式渲染每次交换之间的整个区域。

答案 1 :(得分:1)

您的问题是,您确实在初始化代码中清除了屏幕。但是你需要每帧都清除它,所以就在你的显示开始时(或者你的情况下是空闲的)功能。

答案 2 :(得分:0)

我不使用GLUT,但显示这样的东西的一种非常简单的方法是:

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....
}

答案 3 :(得分:0)

运行此代码,您可能会得到解决方案。

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

编译并运行 -

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