glPushMatrix()/ glPopMatrix()不会影响混合状态。为什么是这样?

时间:2010-11-07 11:23:31

标签: opengl-es

我一直试图让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()弹出/推送的状态的另一个pop / push组合函数?

是否有另一种方法可以轻松地将所有内容设置回以前的状态?感谢任何照明!

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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