这是我的初始化代码:
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()
会禁用它们?
答案 0 :(得分:2)
我会说这是因为在您致电glutCreateWindow()
之前尚未创建context。然后,您可以在创建一个之后设置它们,可以从以下文本解释:
为了使任何OpenGL命令起作用,上下文必须是最新的;所有OpenGL命令都会影响当前上下文中的状态。
由于没有上下文(或旧的,无效的),您对glInit()
的调用不会影响当前窗口的上下文。
答案 1 :(得分:1)
因为当前窗口正在执行glEnable
。致电glutCreateWindow
后,您已经创建了一个新窗口并用它替换了当前的窗口。这个新窗口有一个新的opengl上下文。创建新窗口后,您可以继续并根据需要启用和修改它的上下文。
参考:http://www.opengl.org/documentation/specs/glut/spec3/node16.html