0

在带有显卡atimobility 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 窗口,然后将其打开,随后,当我切换时,对象仅绘制在 glut 窗口的覆盖部分中。如果我重新调整过剩窗口的大小,绘图会像以前一样正常工作。

任何帮助将不胜感激。

问候, fs

4

1 回答 1

1

Glut 仅在您告诉它或它决定时才会在屏幕上重绘。也就是说,如果你不在窗口中做任何事情,场景就不会重绘。这样做的好处:更少的 cpu/gpu 使用。缺点:仅适用于非动画应用程序。

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

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

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

glutIdleFunc(RenderFunction);

这样,当 glut 空闲时,它会继续调用您的渲染函数。

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

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

而不是glutIdleFunc(RenderFunction);,你写

`glutTimerFunc(YOUR_DELAY_IN_MS, RenderFunction, 0);`

只需调用一次渲染函数(您也可以只编写RenderFunction()一次),并且该函数会为下一次运行设置计时器。

作为旁注,我建议使用 SDL 而不是 glut。

于 2011-09-04T10:39:12.840 回答