web-dev-qa-db-ja.com

openglの背景色

ボタンを押してからウィンドウの背景色を変更したいのですが、プログラムが動作しません。理由を教えてください。よろしくお願いします。

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;
    }
9
lego69

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を使用してからしばらく経ち、このコードをテストしていません。それは私の記憶の限りでは、過剰プログラムの一般的な構造を示していますが、それがそのまま正確に機能することを期待しないでください。

18
Jerry Coffin

glClearColorと呼ぶその時点では、OpenGLコンテキストがないと思います。

だが...

...私はこれまでglutを使用したことがないので、 docs をざっと見てみると、実際にはglutCreateWindowの後にコンテキストがあることがわかりますが、おそらくそうではありません。

あなたの質問に対する私のコメントが言っているように、私はglClearColorへの2回目の呼び出しと、あなたがそれに到達するとどう思うかについて興味があります。それが問題の原因である可能性が高いです。キーを押して何かを行うには、glutKeyboardFuncを使用してコールバックを登録する必要があると思います。

0
Troubadour