Я хотел бы создать абстракцию в 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 способа сделать это:
- Создайте свой собственный «вкус» каждой функции настройки среды и вызовите ее. Это, в свою очередь, обновит текущую структуру данных EnvStack и вызовет функцию среды OpenGL.
- Измените функции среды OpenGL так, чтобы они указывали на мои функции среды, которые снова обновят текущую структуру данных EnvStack и вызовут исходные функции среды OpenGL.
Так что вариант 1, очевидно, намного проще. Но я сталкиваюсь с проблемой, если использую код других людей в том смысле, что я не обязательно знаю, какие изменения он вносит в среду, и поэтому моя структура данных будет не синхронизирована. И поскольку весь смысл в том, чтобы иметь простой метод обеспечения правильности настроек среды, это не круто.
Итак, в этом контексте мой вопрос, как мне изменить функции, на которые указывают функции среды OpenGL?