下面是我的初始化代码:
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()要禁用它们呢?
发布于 2011-12-02 07:00:36
我会说这是因为在您调用glutCreateWindow()之前还没有创建context。然后,您可以在创建后设置它们,这可以从以下文本中解释:
要使任何OpenGL命令工作,上下文必须是当前的;所有OpenGL命令都会影响当前上下文的状态。
因为没有上下文(或者是一个旧的、无效的上下文),所以对glInit()的调用不会影响当前窗口的上下文。
发布于 2011-12-02 07:00:00
因为正在对当前窗口执行glEnable。调用glutCreateWindow之后,您就创建了一个新窗口,并用它替换了当前的窗口。这个新窗口有一个新的opengl上下文。在创建一个新窗口之后,您可以继续并根据需要启用和修改它的上下文。
参考:http://www.opengl.org/documentation/specs/glut/spec3/node16.html
https://stackoverflow.com/questions/8349480
复制相似问题