【问题标题】:glPushMatrix() / glPopMatrix() doesn't affect blending states. Why is this?glPushMatrix() / glPopMatrix() 不影响混合状态。为什么是这样?
【发布时间】:2013-02-28 13:28:58
【问题描述】:

我一直在尝试让 OpenGL-ES 大致执行以下操作,以查看是否可以使用 glPushMatrix() 和 glPopMatrix() 将诸如混合状态之类的东西恢复到调用 glPushMatrix() 之前的状态.

它适用于旋转/平移的东西 - 为什么它不适用于其他一些东西,例如混合状态?

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); //<-first blend mode

glPushMatrix();

glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); //<-second blend mode

//...drawing and stuff here...

glPopMatrix(); 

//at this point it appears the second blend mode is still in effect - why?

我是否正确地混淆了,或者对于 glPopMatrix() 和 glPushMatrix() 未弹出/推送的状态,是否还有另一个弹出/推送功能组合?

还有其他方法可以轻松地将一切设置回之前的状态吗?感谢您的任何启发!

【问题讨论】:

    标签: opengl-es


    【解决方案1】:

    OpenGL-ES 不存在属性堆栈,抱歉。

    如果你真的想,你可以自己写一个。所有属性都是可获取的,因此任何堆栈数据结构都可以。

    恕我直言,更好的方法是定义一个充满有用混合预设的手,并拥有一个小状态机,允许您使用最少的 OpenGL-ES 调用从一种混合模式切换到另一种混合模式。毕竟 - 你真的需要多少种不同的混合模式?

    【讨论】:

    • 是的。我希望有某种方法可以一次性重置混合模式、颜色等。看来我可能倒霉了。
    【解决方案2】:

    您可以使用glGet() 获取所有混合选项。然后你可以使用它们来恢复混合状态。

    【讨论】:

      【解决方案3】:

      如您所知,OpenGL 是一个状态机,各种 glPush 和 glPop 函数控制堆栈。现在,有多个堆栈。矩阵堆栈仅包含坐标变换。还有另一个堆栈,称为属性堆栈,其中包含您的混合功能设置。查看glPushAttrib

      【讨论】:

      • OpenGL-ES 中没有 glPushAttrib() :(
      猜你喜欢
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 2011-06-02
      相关资源
      最近更新 更多