在Open GL中绘制具有双缓冲区和预定帧速率的线

时间:2015-06-28 20:14:06

标签: c++ opengl glut doublebuffered

我想编写一个带有两个缓冲区的程序,并在控制台中显示每秒30帧的帧速率。我正在使用Open GL - C ++

    Display()
    {
      glutSwapBuffers();
    }

fps的计时器:

     void mytimer(int fps)
     {
       glutTimerFunc(1000/30 , mytimer, 0);
       glutPostRedisplay();
     }

此代码绘制一条线,但我想以30 fps的帧速率绘制一条线。

      void drawScene (void){
        glClear(GL_COLOR_BUFFER_BIT);
        glBegin(GL_LINES);
        glVertex2f(0.0,0.0);
        glVertex2f(120.0,120.0);
        glEnd();
        glFlush();
      }

     int main (int argc ,char** argv){
       glutInit(&argc,argv);
       glutInitDisplayMode(GLUT_RGB);
       glutInitWindowSize(360,360);
       glutCreateWindow("mohammad");
       initRendering();
       mytimer(fps);
       //glutDisplayFunc(drawScene);
       glutDisplayFunc(Display);
       glutMainLoop();
       return (0);
     }

2 个答案:

答案 0 :(得分:0)

undefined告诉GLUT“从现在开始,每1000/30毫秒调用glutTimerFunc(1000/30 , mytimer, 0);”。您可能想要从mytimer调用它。否则GLUT将不知道您已经编写了计时器功能。

答案 1 :(得分:0)

第一步。

你的代码中有这一行吗?

glutIdleFunc(idle);

如果是,请转到idle()方法并对其中的所有内容进行注释。你需要强迫glutIdleFunc()什么都不做。通常你有这个:

    // executes every time if there is nothing to do basically.
void idle()
{
    glutPostRedisplay(); //draw a frame
}
// callback
glutIdleFunc(idle);

由于回调(glutIdleFunc)每次调用idle()如果opengl没有更好的办法,那么你就无法控制fps,你需要禁用它。然后,你的计时器应该可以正常工作。

这是我的代码限制为60 fps。效果很好。

    void frame_limit(int value)
{
    glutPostRedisplay();
    glutTimerFunc(1000 / 60, frame_limit, 0);
}

void idle()
{
    //glutPostRedisplay();
}



void setupCallbacks()
{
    glutCloseFunc(cleanup);
    glutDisplayFunc(display);
    glutIdleFunc(idle);
    glutTimerFunc(1000 / 60, frame_limit, 0);
}

void init(int argc, char* argv[])
{
    createShaderProgram();
    createBufferObjects();
    setupCallbacks();
}

int main(int argc, char* argv[])
{
    init(argc, argv);
    glutMainLoop();
    exit(EXIT_SUCCESS);
}