0

ビデオカードatiモビリティradeon 5650を搭載したWindows 7ホームアルティメットで無料の過剰摂取を使用する

コードスニペット:

void ResizeFunction(int width, int height)
{
    glViewport(0, 0, width, height);
}

 void RenderFunction()
{
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    //...drawing code based on some flag, I draw a triangle or a rectangle
    //the flag is toggled on pressing 't' or 'T' key
    glutSwapBuffers(); //double buffering is enabled
    glutPostRedisplay();
}

void KeyboardFunction(unsigned char key, int x, int y)
{
    switch(key)
    {
        case 't':
        case 'T':
        {
            flag = !flag;
            glutPostRedisplay();
            break;
        }
        default:
            break;
    }
}

問題: 最初にウィンドウ全体を覆う三角形または長方形が描画されます。しかし、過剰ウィンドウを別のウィンドウ (たとえば、メモ帳ウィンドウ) で部分的に覆い、それを明らかにすると、その後、トグルすると、過剰ウィンドウの覆われた部分にのみオブジェクトが描画されます。glutウィンドウのサイズを変更すると、描画は以前と同じように正しく機能します。

どんな助けでも大歓迎です。

よろしく、fs

4

1 に答える 1

1

Glutは、あなたがそれを伝えたとき、または決定したときにのみ画面に再描画されます. つまり、ウィンドウで何もしなければ、シーンは再描画されません。これの利点: CPU/GPU の使用量が少なくなります。短所: アニメーション化されていないアプリケーションにのみ適しています。

画面を常に更新したい場合 (これは、多くのアニメーションを使用するアプリケーション (ゲームなど) で行われていることです)、次を使用できます。glutIdleFunc

http://www.opengl.org/resources/libraries/glut/spec3/node63.html

これはプログラムの最初で、すべての関数を glut 用に設定するときに、次のようにも記述します。

glutIdleFunc(RenderFunction);

このようにして、glut がアイドル状態のとき、render 関数を呼び出し続けます。

レンダリングを可能な限り遅くしたい場合 (たとえば、固定フレーム レートなど)、タイマーを使用できます。

void RenderFunction()
{
    glutTimerFunc(YOUR_DELAY_IN_MS, RenderFunction, 0);
    /* rest of code */
}

の代わりにglutIdleFunc(RenderFunction);、あなたは書く

`glutTimerFunc(YOUR_DELAY_IN_MS, RenderFunction, 0);`

render 関数を 1 回呼び出すだけで (1RenderFunction()回書き込むこともできます)、関数は次の実行のためにタイマーを設定し続けます。

余談ですが、glut の代わりに SDL を使用することをお勧めします。

于 2011-09-04T10:39:12.840 に答える