我想在 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();
在我看来,只有两种方法可以做到这一点:
- 为每个环境设置函数创建我自己的“风格”并调用它。它将依次更新当前的 EnvStack 数据结构并调用 OpenGL 环境函数。
- 更改 OpenGL 环境函数以指向我的环境函数,这将再次更新当前的 EnvStack 数据结构并调用原始的 OpenGL 环境函数。
所以选项1显然要简单得多。但是,如果我使用其他人的代码,我会遇到一个问题,因为我不一定知道它对环境做出了什么改变,因此我的数据结构会不同步。而且由于重点是有一个简单的方法来确保环境设置正确,这并不酷。
所以我的问题是,在这种情况下,如何更改 OpenGL 环境函数指向的函数?