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