0

glutMainLoop() を呼び出す前に、ライトとマテリアルの色を初期化します。

glShadeModel(GL_FLAT);

glMaterialfv(GL_FRONT, GL_AMBIENT, (const GLfloat[]){1,0.2,0} );
glMaterialfv(GL_FRONT, GL_DIFFUSE, (const GLfloat[]){1,0.6,0} );
glMaterialfv(GL_FRONT, GL_SPECULAR, (const GLfloat[]){1,0.8,0} );
glMaterialfv(GL_FRONT, GL_SHININESS, (const GLfloat[]){1,1,0} );

glLightfv(GL_LIGHT0, GL_AMBIENT, (const GLfloat[]){1,1,1});
glLightfv(GL_LIGHT0, GL_DIFFUSE, (const GLfloat[]){1,1,1});
glLightfv(GL_LIGHT0, GL_SPECULAR, (const GLfloat[]){1,1,1});

glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);

プログラムの実行中に、マテリアルの色を変更したいと思います。
マテリアルの色を変更してから glutPostRedisplay() を呼び出すキーボード関数があります。

glMaterialfv(GL_FRONT, GL_AMBIENT, (const GLfloat[]){0,0.2,1} );
glMaterialfv(GL_FRONT, GL_DIFFUSE, (const GLfloat[]){0,0.6,1} );
glMaterialfv(GL_FRONT, GL_SPECULAR, (const GLfloat[]){0,0.8,1} );
glMaterialfv(GL_FRONT, GL_SHININESS, (const GLfloat[]){0,1,1} );
glutPostRedisplay();

しかし、それは問題です。その関数を呼び出すと、描画したオブジェクトが消えてしまうからです。だから私はティーポットを描きますが、キーを押して色を変えると消えます。

4

1 に答える 1

1

glutMainLoop()を呼び出す前に、ライトとマテリアルの色を初期化します

間違ったアプローチ。OpenGLは初期化されていません。これは状態ベースの描画マシンであり、その状態を必要とするものを描画する直前に各状態を設定する必要があります。これは、OpenGL操作をユーザーインタラクションおよびイベントハンドラーに入れないことも意味します。必要なときに、必要な場所にすべてを描画コードに配置します。

于 2012-12-15T16:17:05.190 に答える