在openGL中全屏显示

时间:2013-04-09 01:33:45

标签: c++ winapi opengl fullscreen

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

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

这在我的代码中没有评估为true,即使它在给出的示例代码中也是如此。这更令人困惑,因为到目前为止,解决所有事情的方式完全相同。

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

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

2 个答案:

答案 0 :(得分:7)

如果您刚学习,可以尝试使用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;
}

答案 1 :(得分:2)

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

现在如果你自己构建一个DEVMODE,可能性是,你正在构建Windows不喜欢的东西。这也适用于许多此类结构,例如串口设置非常挑剔。

这是我在自己的代码中建议和做的事情:首先从Windows检索一个工作结构,然后修改它并将其传回。如果有一个枚举函数,首先看一下,Windows已经知道一个接近你想要的模式。 如果显示设置必须使用其中一种枚举模式,因为Windows的更高版本不允许使用任何不同的模式如果显示器无法同步到新设置,请将用户留空。

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

设置显示模式