【问题标题】:Creating an Environment Stack in OpenGL在 OpenGL 中创建环境堆栈
【发布时间】:2010-09-26 20:59:52
【问题描述】:

我想在 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(); 

在我看来,只有两种方法可以做到这一点:

  1. 为每个环境设置函数创建我自己的“风格”并调用它。它将依次更新当前的 EnvStack 数据结构并调用 OpenGL 环境函数。
  2. 改变OpenGL环境函数指向my环境函数,这将再次更新当前EnvStack数据结构并调用原始OpenGL环境函数。

所以选项 1 显然要简单得多。但是,如果我使用其他人的代码,我会遇到一个问题,因为我不一定知道它对环境做出了什么改变,因此我的数据结构会不同步。而且由于关键是要有一个简单的方法来确保环境设置正确,这并不酷。

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

【问题讨论】:

    标签: c++ c opengl abstraction


    【解决方案1】:

    OpenGL 已经包含此功能。你想要glPushAttrib(GL_ALL_ATTRIB_BITS);glPopAttrib();。请参阅http://opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushattrib.html 了解更多信息。

    【讨论】:

    • 哇。我从来没有遇到过。这似乎是一件非常有用的事情,他们必须有办法做到这一点。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多