【问题标题】:Full screen in openGLopenGL中的全屏
【发布时间】:2013-04-09 01:33:45
【问题描述】:

我正在尝试全屏渲染 openGL 窗口,并正在使用 NeHe 教程来学习如何做到这一点。但是我已经达到了在给出的示例代码和我自己的代码中使用完全相同的代码的地步,但是当它到达这一行时:

if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)

这在我的代码中不会评估为 true,即使它在给出的示例代码中也是如此。这更令人困惑,因为在调试时一切都完全一样。

我是否缺少一些简单的东西,例如项目属性中的某些东西,或者如果没有,有人可以就创建全屏窗口的任何其他方式向我提供建议。

我正在使用的 NeHe 教程: http://nehe.gamedev.net/tutorial/creating_an_opengl_window_%28win32%29/13001/

【问题讨论】:

  • 您的显示器/显卡可能不支持您在dmScreenSettings中设置的设置
  • 原来即使分辨率不完全一样,我的电脑也不喜欢
  • 您是否尝试过编译和运行 NeHe 的示例代码并保持不变?

标签: c++ winapi opengl fullscreen


【解决方案1】:

如果您只是在学习,可以尝试使用 GLUT。您可以用它在几行代码中创建一个窗口,并且您可以随意处理您的 OpenGL 代码,直到您对它感到满意并实际尝试使用特定平台的 API(例如 WinAPI)。

您需要安装 Freeglut(实现过时的 GLUT)和 GLEW(为了便于使用 OpenGL 1.1+ 功能,因为微软的 gl.h 从那时起就没有更新)

最少的代码:

#define FREEGLUT_STATIC // defined so you can link to freeglut_static.lib when compiling
#define GLEW_STATIC     // defined so you can link to glew's static .lib when compiling

#include <GL/glew.h>     // has to be included before gl.h, or any header that includes gl.h
#include <GL/freeglut.h>

void draw()
{
    // code for rendering here
    glutSwapBuffers();   // swapping image buffer for double buffering
    glutPostRedisplay(); // redrawing. Omit this line if you don't want constant redraw
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); // enabling double buffering and RGBA
    glutInitWindowSize(600, 600);
    glutCreateWindow("OpenGL"); // creating the window
    glutFullScreen();           // making the window full screen
    glutDisplayFunc(draw);      // draw is your function for redrawing the screen

    glutMainLoop();

    return 0;
}

【讨论】:

  • 是否可以避免给出屏幕尺寸(600, 600) 却获得全屏?
  • @ar2015 试一试也无妨
【解决方案2】:

Windows 对您放入 DEVMODE 等结构的内容往往非常挑剔。看看DEVMODE,这个结构是巨大的,并且有很多与显示器完全无关的条目,例如纸张尺寸(事实证明,相同的结构也可以用于打印机)。

现在,如果您自己构建 DEVMODE,则很有可能您正在构建 Windows 不喜欢的东西。这也适用于许多其他此类结构,例如串行端口设置非常挑剔。

以下是我在自己的代码中建议和执行的操作:首先从 Windows 检索一个工作结构,然后对其进行修改并将其传回。如果有枚举功能,首先看一下,Windows 已经知道一种接近您想要的模式。 对于显示设置,您必须使用其中一种枚举模式,因为更高版本的 Windows 将不允许任何不同的模式,以免如果显示器无法同步到新设置,则给用户留下空白屏幕。

要枚举使用函数EnumDisplaySettings。然后寻找最接近您需求的设置;或者更好的是,向用户显示可用模式列表并让他从中选择。然后使用windows给你的结构,通过ChangeDisplaySettings设置显示模式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多