glutCreateWindow(...)重置我启用的标志?

时间:2011-12-01 22:52:40

标签: c++ opengl

这是我的初始化代码:

const int WIN_HEIGHT = 640;
const int WIN_WIDTH = 640;
void main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

    /* lines in question */
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_NORMALIZE);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glShadeModel(GL_SMOOTH);

    glutInitWindowSize(WIN_WIDTH, WIN_HEIGHT);
    glutCreateWindow("OpenGL");
    glutDisplayFunc(Draw);
    glutKeyboardFunc(HandleInput);
    Initialize();

    glutMainLoop();
}

因此,大多数代码都是基本3D程序的样板。问题是,如果我将所有glEnable()行放在glutCreateWindow()之前,则会重置它们。这是一个足够简单的修复,可以在创建窗口后移动它们(我将它们移动到我自己的Initialize()函数中),但为什么glutCreateWindow()会禁用它们?

2 个答案:

答案 0 :(得分:2)

我会说这是因为在您致电glutCreateWindow()之前尚未创建context。然后,您可以在创建一个之后设置它们,可以从以下文本解释:

  

为了使任何OpenGL命令起作用,上下文必须是最新的;所有OpenGL命令都会影响当前上下文中的状态。

由于没有上下文(或旧的,无效的),您对glInit()的调用不会影响当前窗口的上下文。

答案 1 :(得分:1)

因为当前窗口正在执行glEnable。致电glutCreateWindow后,您已经创建了一个新窗口并用它替换了当前的窗口。这个新窗口有一个新的opengl上下文。创建新窗口后,您可以继续并根据需要启用和修改它的上下文。

参考:http://www.opengl.org/documentation/specs/glut/spec3/node16.html