Почему glClear не очищает мой экран? - PullRequest
6 голосов
/ 22 мая 2011

Вот моя простая программа opengl.Я пытаюсь очистить экран, прежде чем нарисовать треугольник.Я вызвал glClear () в моей функции init (), однако, казалось, что он не смог очистить экран.

#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 ]

4 голосов
/ 22 мая 2011

Где ваш обратный вызов дисплея?Вы не должны использовать функцию ожидания для рисования.

Все рисование должно происходить в соответствующих обратных вызовах, контекст GL может быть неактивен, пока не начнет выполняться glutMainLoop, и без активного контекста ваши командыпросто игнорируются (без контекста может даже не быть места для хранения ошибок для извлечения с помощью glGetError).

ПРИМЕЧАНИЕ. Обычно вы хотите очистить буфер в начале каждого кадра.Вы можете избежать очистки всего один раз с помощью одиночной буферизации, но двойная буферизация лучше и требует, чтобы вы каким-то образом отображали всю область между каждым обменом.

1 голос
/ 22 мая 2011

Ваша проблема в том, что вы очищаете экран в коде инициализации. Но вам нужно очищать его каждый кадр, поэтому в самом начале функции отображения (или в вашем случае простоя).

0 голосов
/ 13 февраля 2018

Запустите этот код, и, вероятно, вы получите решение.

#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
0 голосов
/ 22 мая 2011

Я не использую 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....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...