Неверный случайный цветной прямоугольник - PullRequest
2 голосов
/ 11 марта 2019

Я хочу отобразить случайные цвета в GL_POLYGON.

Но цвета меняются только при минимизации и максимизации. Он выбирает другой цвет при максимизации и другой цвет при минимизации. Но он случайным образом выбирает цвета, пока я продолжаю минимизировать и максимизировать

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

void display( void )
{
    glClear( GL_COLOR_BUFFER_BIT );
    glBegin( GL_POLYGON );
    for( int i = 0; i < 255; i++ )
    {
        glColor3ub( rand(), rand(), rand() );
    }
    glVertex3f( 0.25, 0.25, 0.0 );
    glVertex3f( 0.75, 0.25, 0.0 );
    glVertex3f( 0.75, 0.75, 0.0 );
    glVertex3f( 0.25, 0.75, 0.0 );
    glEnd();

    glColor3f( 0.0, 0.0, 0.0 );
    glRectf( 0.45, 0.25, 0.55, 0.05 );
    glRectf( 0.35, 0.08, 0.65, 0.02 );

    glFlush();
}

void init( void )
{
    glClearColor( 1.0, 1.0, 1.0, 1.0 );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho( 0.0, 1.0, 0.0, 1.0, -1.0, 1.0 );
}

int main( int argc, char** argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB );
    glutInitWindowSize( 250, 250 );
    glutInitWindowPosition( 100, 100 );
    glutCreateWindow( "Assignment" );
    init();
    glutDisplayFunc( display );
    glutMainLoop();
    return 0;
}

1 Ответ

1 голос
/ 11 марта 2019

glutDisplayFunc() вызывает ваш обратный вызов только тогда, когда ОС требует перерисовки вашего окна.Если вам нужны более регулярные вызовы, вам нужно инициировать их самостоятельно с помощью glutPostRedisplay():

... Когда GLUT определяет, что нормальную плоскость для окна необходимо повторно отобразить,вызывается обратный вызов дисплея для окна....

...

GLUT определяет, когда обратный вызов дисплея должен быть запущен, на основе состояния повторного отображения окна.Состояние повторного отображения для окна может быть установлено явно, путем вызова glutPostRedisplay или неявно, как результат повреждения окна, сообщенного оконной системой.GLUT объединяет несколько опубликованных повторных отображений для окна, чтобы минимизировать количество вызываемых обратных вызовов.

Мне нравится использовать glutTimerFunc() для периодического вызова glutPostRedisplay():

#include <GL/glut.h>
#include <cstdlib>

void timer( int value )
{
    glutPostRedisplay();
    glutTimerFunc( 16, timer, 0 );
}

void display()
{
    glClearColor( 0.2, 0.2, 0.2, 1 );
    glClear( GL_COLOR_BUFFER_BIT );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    glBegin( GL_POLYGON );
    glColor3ub( rand(), rand(), rand() );
    glVertex3f( 0.25, 0.25, 0.0 );
    glVertex3f( 0.75, 0.25, 0.0 );
    glVertex3f( 0.75, 0.75, 0.0 );
    glVertex3f( 0.25, 0.75, 0.0 );
    glEnd();

    glColor3f( 0.0, 0.0, 0.0 );
    glRectf( 0.45, 0.25, 0.55, 0.05 );
    glRectf( 0.35, 0.08, 0.65, 0.02 );

    glutSwapBuffers();
}

int main( int argc, char** argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
    glutInitWindowSize( 250, 250 );
    glutCreateWindow( "GLUT" );
    glutDisplayFunc( display );
    glutTimerFunc( 0, timer, 0 );
    glutMainLoop();
    return 0;
}
...