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全屏渲染的主要内容,如果未能解决你的问题,请参考以下文章

如何为 3rd 方渲染提供空 QML 项的 OpenGL 上下文?

全屏模糊 GLSL 显示对角线(OpenGL 核心)

将 CIFilter 应用于 OpenGL 渲染到纹理

OpenGL4.0教程 计算着色器简介

OpenGL独占模式全屏

为多个显示器设置 OpenGL