当调用glutPostRedisplay时,如何强制GL应用程序中的背景颜色立即更改?

时间:2012-09-30 23:20:13

标签: opengl background-color glut

我有一个简单的窗口,其背景颜色在主循环中设置,带有一些全局变量:

顶部的全球价值观:

static GLfloat redIntensity = 0.0; //values for background color 
static GLfloat greenIntensity = 0.0;
static GLfloat blueIntensity = 0.0;

主要:

int main(int argc, char** argv){
  ...
  glutDisplayFunc(display);
  ...
  glutKeyboardFunc(keyboard);  //**** 
  glutMainLoop();
  return 0;
}

根据全局值实际设置颜色的显示:

  void display(void){

    glClear(GL_COLOR_BUFFER_BIT);     
    glPushMatrix();                   
    glClearColor(redIntensity, greenIntensity, blueIntensity, 0.0);
    ...
    ... //other stuff here is polygon drawn in middle of screen 

    glPopMatrix();
    glutSwapBuffers();
  }

在键盘功能中,我有一个switch语句,应根据按下的键改变背景颜色,例如:

...
     case 'm':
     {
       redIntensity = 0.5;
       greenIntensity = 0.0;
       blueIntensity = 0.5;
       bgc = MAGENTA;  //another global thing to keep track of current color for other reasons... 
     }
... 
glutPostRedisplay(); 

不幸的是,通过glutPostRedisplay()调用,背景颜色不会立即更改...用户必须先点击其他位置或先按其他键。我在其他地方读到glutPostRedisplay()仅重新显示重新显示,所以我尝试直接在行中添加glFlush()。这仍然不起作用,所以我尝试在那里调用glutDisplayFunc(display)。再一次,不成功。

如何在按下琴键后强制改变颜色?也许主要或其他地方的订购电话引起了问题?嗯......

1 个答案:

答案 0 :(得分:5)

OpenGL是一个状态机。当调用glClear时,它使用先前使用glClearColor,glClearDepth,glClearStencil设置的值。所以解决方案是在显示的glClear调用之前调用glClearColor。