Создание стека среды в OpenGL

Я хотел бы создать абстракцию в OpenGL настроек среды (смешивание, трафарет, глубина и т. Д.), Которая работает как матричный стек. Нажмите на стек, внесите любые необходимые изменения, нарисуйте объекты, затем сложите стек и вернитесь к предыдущим настройкам.

Например, в настоящее время у вас может быть такой код для рисования:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_DEPTH_TEST);
//Draw operations
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND); 

Но со стеком среды это будет выглядеть так:

glPushEnv();
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_DEPTH_TEST);
//Draw operations
glPopEnv(); 

На мой взгляд, есть только 2 способа сделать это:

  1. Создайте свой собственный «вкус» каждой функции настройки среды и вызовите ее. Это, в свою очередь, обновит текущую структуру данных EnvStack и вызовет функцию среды OpenGL.
  2. Измените функции среды OpenGL, чтобы они указывали на функции моей среды, которые снова обновят текущую структуру данных EnvStack и вызовут исходные функции среды OpenGL.

Таким образом, вариант 1, очевидно, намного проще. Но я сталкиваюсь с проблемой, если использую код других людей в том смысле, что я не обязательно знаю, какие изменения он вносит в среду, и поэтому моя структура данных будет не синхронизирована. И поскольку весь смысл в том, чтобы иметь простой метод обеспечения правильности настроек среды, это не круто.

Таким образом, мой вопрос в этом контексте, как я могу изменить функции, на которые указывают функции среды OpenGL?

14.12.2008 17:11:36
1 ОТВЕТ
РЕШЕНИЕ

OpenGL уже содержит эту функциональность. Вы хотите glPushAttrib(GL_ALL_ATTRIB_BITS);и glPopAttrib();. См. Http://opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushattrib.html для получения дополнительной информации.

6
14.12.2008 17:39:26
Ух ты. Я никогда не сталкивался с этим. Казалось, что-то настолько полезное, что у них должен был быть способ сделать это. Спасибо.
Whaledawg 14.12.2008 18:23:43