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()ので、直後に行を追加glFlush()してみました。これでもうまくいかなかったので、glutDisplayFunc(display)代わりにそこに電話をかけてみました。もう一度、失敗。

キーを押した直後に強制的に色を変更するにはどうすればよいですか? おそらく、メインまたは他の場所での順序付け呼び出しが問題を引き起こしているのでしょうか? うーん...

4

1 に答える 1

5

OpenGL はステート マシンです。glClear が呼び出されると、glClearColor、glClearDepth、glClearStencil で以前に設定された値が使用されます。したがって、解決策は、表示中の glClear 呼び出しの前に glClearColor 呼び出しを配置することです。

于 2012-09-30T23:41:33.410 に答える