4

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

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

这在我的代码中不会评估为 true,即使它在给出的示例代码中也是如此。这更加令人困惑,因为到目前为止调试所有内容都完全相同。

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

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

4

2 回答 2

9

如果您只是在学习,可以尝试使用 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;
}
于 2013-04-09T04:22:59.707 回答
4

Windows 在您放入诸如DEVMODE. 看一下DEVMODE,这个结构很大,并且有很多与显示器完全无关的条目,例如纸张尺寸(事实证明,相同的结构也可以用于打印机)。

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

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

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

于 2013-04-09T10:07:54.867 回答