ボタンを押してからウィンドウの背景色を変更したいのですが、プログラムが動作しません。理由を教えてください。よろしくお願いします。
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(800, 600);
glutInitWindowPosition(300,50);
glutCreateWindow("GLRect");
glClearColor(1.0f, 0.0f, 0.0f, 1.0f); <---
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
glutMainLoop();
system("pause");
glClearColor(0.0f, 1.0f, 0.0f, 1.0f); <---
return 0;
}
glClearColor
は、それ自体をクリアすることはありません。実際にクリアしたときの色を設定するだけです。クリア自体を行うには、(少なくとも)_COLOR_BUFFER_BIT
_を指定してglClear
を呼び出す必要があります。
編集:私がglutを使用してからかなり時間が経っているので、これの詳細は間違っている可能性がありますが、メモリが役立つ場合は、キーボードのキーを押したことに応じて画面の色を変更するには、次のようにします:
_void keyboard (unsigned char key, int x, int y)
{
// we'll switch between red and blue when the user presses a key:
GLfloat colors[][3] = { { 0.0f, 0.0f, 1.0f}, {1.0f, 0.0f, 0.0f } };
static int back;
switch (key) {
case 27:
exit(0);
default:
back ^= 1;
glClearColor(colors[back][0], colors[back][1], colors[back][2], 1.0f);
glutPostRedisplay();
}
}
void draw() {
glClear(GL_COLOR_BUFFER_BIT);
// other drawing here...
}
int main() {
// glutInit, glutInitDisplayMode, etc.
glutDisplayFunc(draw);
glutKeyboardFunc(keyboard);
glutMainLoop();
}
_
基本的に、glutDisplayFunc
に渡す関数ですべての描画を行います。他のほとんどのものは状態を変更するだけで、PostRedisplayFunc();
を呼び出して、ウィンドウを再描画する必要があることをglutに伝えます。警告:私が言ったように、私がglutを使用してからしばらく経ち、このコードをテストしていません。それは私の記憶の限りでは、過剰プログラムの一般的な構造を示していますが、それがそのまま正確に機能することを期待しないでください。
glClearColor
と呼ぶその時点では、OpenGLコンテキストがないと思います。
だが...
...私はこれまでglutを使用したことがないので、 docs をざっと見てみると、実際にはglutCreateWindow
の後にコンテキストがあることがわかりますが、おそらくそうではありません。
あなたの質問に対する私のコメントが言っているように、私はglClearColor
への2回目の呼び出しと、あなたがそれに到達するとどう思うかについて興味があります。それが問題の原因である可能性が高いです。キーを押して何かを行うには、glutKeyboardFunc
を使用してコールバックを登録する必要があると思います。