OpenGL全屏渲染
Posted
技术标签:
【中文标题】OpenGL全屏渲染【英文标题】:OpenGL fullscreen rendering 【发布时间】:2011-12-12 22:24:10 【问题描述】:我目前正在使用 openGL 编写游戏,我已经处于第一人称模式,使用 W&S 控制“相机”并使用鼠标旋转。
由于某种原因,当我处于窗口模式时,我移动和旋转的速度似乎比全屏时的速度快得多,但这不是我的主要问题。 (*1)
由于上述原因,我决定将游戏限制为全屏。
我的关卡是一个立方体,每一面都是不同的 RGB 颜色,当我快速移动鼠标时,关卡的角落会变得非常块状,直到我放慢速度。 (*2)
任何人都知道这两个问题(*1,*2)发生了什么。
我试着给你们截图了,但是截图看起来很正常。
【问题讨论】:
你在全屏和窗口下获得什么样的帧速率? 您使用的是 GLUT 还是像 win32 这样的 OS API? 呃,我不知道我得到的帧率是多少,有什么方法可以在不编码的情况下显示它? :P 是的,我使用 GLUT 库。 如果在你转得非常快时它变得块状,那可能是由于 vsync... 至于相机移动太快:游戏中的一切都必须依赖于帧之间的时间。所以你的相机旋转代码应该是:camera.rotate(rotx * timeSinceLastFrame, roty * timeSinceLastFrame)
。这让一切都保持在一个恒定的速度。
啊好的 :) 关于 timeSinceLastFrame,有没有什么好的干净的方法来做这些事情而不是数学计算,也许是 GLUT 计时器或其他什么?这对我来说都是全新的:D。
【参考方案1】:
使用glutGet(GLUT_ELAPSED_TIME)
测量您的帧时间:
void displayCallback()
int start = glutGet(GLUT_ELAPSED_TIME);
drawFrame();
glutSwapBuffers();
int end = glutGet(GLUT_ELAPSED_TIME);
cout << "Frame time: " << (end-start) << "ms" << endl;
如果它们在 16-17 毫秒左右,您很可能有一些垂直同步。管理 vsync 取决于系统,无论是访问方法还是可靠性:(
你最好的选择是frame-rate independence,所以无论你跑得多快/慢,你都会做正确的事。
【讨论】:
以上是关于OpenGL全屏渲染的主要内容,如果未能解决你的问题,请参考以下文章