我一直试图让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组合函数?
是否有另一种方法可以轻松地将所有内容设置回以前的状态?感谢任何照明!
答案 0 :(得分:5)
对于OpenGL-ES,属性的堆栈不存在,抱歉。
如果你真的想,你可以自己写一个。所有属性都是可获取的,因此任何堆栈数据结构都可以。
Imho更好的方法是定义一个充满有用的混合预设的手,并有一个小的状态机,允许您使用最少的调用OpenGL-ES从一种混合模式切换到另一种混合模式。毕竟 - 你真的需要多少种不同的混合模式?
答案 1 :(得分:0)
如您所知,OpenGL是一个状态机,各种glPush和glPop函数控制堆栈。现在,有多个堆栈。矩阵堆栈仅包含坐标变换。还有另一个堆栈,称为属性堆栈,它包含您的混合功能设置。查看glPushAttrib。
答案 2 :(得分:0)
您可以使用glGet()获取所有混合选项。然后,您可以使用它们来恢复混合状态。