【问题标题】:Draw a Line with double buffer and pre-determined frame rate in Open GL在 Opengl 中绘制一条具有双缓冲区和预定帧速率的线
【发布时间】:2015-09-15 05:52:18
【问题描述】:

我想编写一个具有两个缓冲区的程序,并且在控制台中显示每秒 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);
     }

【问题讨论】:

  • 只需...在Display() 的顶部致电drawScene()

标签: c++ opengl glut doublebuffered


【解决方案1】:

第一步。

你的代码中有这行吗?

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

【讨论】:

    【解决方案2】:

    glutTimerFunc(1000/30 , mytimer, 0); 告诉 GLUT“从现在开始,每 1000/30 毫秒调用一次mytimer”。您可能想从main 调用它。否则 GLUT 不会知道你写了一个定时器函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 2013-12-19
      • 2014-06-26
      • 1970-01-01
      相关资源
      最近更新 更多