GlutCreateWindow (...) сброс моих активированных флагов?

Вот мой код инициализации:

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 ответа

Я бы сказал, потому что контекст еще не создан до вашего вызова glutCreateWindow(). Затем вы можете установить их после создания, что можно интерпретировать из следующего текста:

Для того, чтобы любые команды OpenGL работали, контекст должен быть текущим; все команды OpenGL влияют на состояние текущего контекста.

Поскольку не было контекста (или старого, недействительного), ваши вызовы glInit() не влияют на текущий контекст окна.


Поскольку glEnable выполняется в текущем окне. После вызова glutCreateWindow вы создали новое окно и заменили его на новый. Это новое окно имеет новый контекст opengl. После создания нового окна вы можете продолжить и включить и изменить его контекст по своему усмотрению.

Ссылка: http://www.opengl.org/documentation/specs/glut/spec3/node16.html

licensed under cc by-sa 3.0 with attribution.