错误的随机彩色矩形

时间:2019-03-11 15:27:02

标签: c++ opengl glut

我想在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 个答案:

答案 0 :(得分:1)

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