Вопрос

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

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top