Создание стека среды в OpenGL - PullRequest
2 голосов
/ 14 декабря 2008

Я хотел бы создать абстракцию в 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?

1 Ответ

6 голосов
/ 14 декабря 2008

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

...