glutCreateWindow (...) сбросить мои включенные флаги? - PullRequest
1 голос
/ 02 декабря 2011

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

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 ]

2 голосов
/ 02 декабря 2011

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

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

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

1 голос
/ 02 декабря 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...