2

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

顶部的全局值:

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()只有 QUEUES 重新显示,所以我尝试glFlush()在之后直接添加该行。这仍然不起作用,所以我尝试在glutDisplayFunc(display)那里直接跟注。再一次,失败。

按下键后如何强制更改颜色?也许 main 或其他地方的排序调用引起了问题?唔...

4

1 回答 1

5

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

于 2012-09-30T23:41:33.410 回答