部分覆盖的过剩窗口在被揭开后不能正确重绘

时间:2011-08-29 05:38:08

标签: windows opengl refresh glut redraw

Windows 7家庭终极上使用免费过剩与视频卡 ati mobility radeon 5650

代码段:

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

问题:第一次绘制覆盖整个窗口的三角形或矩形。但是,如果我用另一个窗口部分覆盖过剩窗口(比如说,带有一些记事本窗口),然后将其揭开,随后,当我切换时,该对象仅在过剩窗口的被覆盖部分中被绘制。如果我重新调整过剩窗口的大小,绘图就像以前一样正常工作。

任何帮助将不胜感激。

的问候, FS

1 个答案:

答案 0 :(得分:1)

Glut只会在您告诉它或决定时在屏幕上重绘。也就是说,如果您在窗口中没有执行任何操作,则不会重绘场景。优点:减少cpu / gpu的使用。缺点:仅适用于非动画应用程序。

如果您想要不断更新屏幕(这是在具有大量动画的应用程序(例如游戏)中完成的操作),您可以使用glutIdleFunc

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

当你为glut设置所有函数时,就在程序的开头,你也写道:

glutIdleFunc(RenderFunction);

这样,当过剩时,它会一直调用你的渲染函数。

如果想要渲染得比较慢(例如使用固定的帧速率),可以使用计时器:

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

而不是glutIdleFunc(RenderFunction);,你写

`glutTimerFunc(YOUR_DELAY_IN_MS, RenderFunction, 0);`

简单地调用渲染函数一次(你也可以只编写一次RenderFunction())并且该函数会继续为下次运行设置计时器。

作为旁注,我建议使用SDL代替过剩。