【问题标题】:Incorrect random coloured rectangle不正确的随机彩色矩形
【发布时间】:2019-03-11 15:27:01
【问题描述】:

我想在 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;
}

【问题讨论】:

    标签: c++ opengl glut


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      • 2013-01-18
      相关资源
      最近更新 更多