C++ 在OpenGL中创建环境堆栈

C++ 在OpenGL中创建环境堆栈,c++,c,opengl,abstraction,C++,C,Opengl,Abstraction,我想在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_BLE

我想在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(); 
但如果使用环境堆栈,它将如下所示:

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(); 
在我看来,只有两种方法可以做到这一点:

  • 创建我自己的每个环境设置函数的“风格”,并调用它。它将依次更新当前的EnvStack数据结构并调用OpenGL环境函数。
  • 更改OpenGL环境函数以指向my environment函数,这将再次更新当前的EnvStack数据结构并调用原始OpenGL环境函数。 因此,选项1显然要简单得多。但是如果我使用其他人的代码,我会遇到一个问题,因为我不一定知道它对环境所做的更改,因此我的数据结构将不同步。而且,由于关键是要有一个简单的方法来确保环境设置是正确的,所以这并不酷


    因此,我的问题是,在这种情况下,如何更改OpenGL环境函数指向的函数?

    OpenGL已经包含此功能。您需要
    glPushAttrib(GL\u所有属性位)
    glpopatrib()。有关更多信息,请参阅。

    Wow。我从未遇到过这种情况。这似乎是一件非常有用的事情,他们必须有办法做到这一点。谢谢