恢复OpenGL状态

时间:2012-09-18 12:20:20

标签: c++ c opengl-es opengl-es-2.0

我想编写一个通用实用程序函数,它将使用OpenGL Framebuffer对象创建一个纹理,某些OpenGL程序可以将其用于第三方程序员想要的任何目的。

让我们说,对于参数桩,该函数看起来像

void createSpecialTexture(GLuint textureID)
{
    MyOpenGLState state;
    saveOpenGLState(state);
    setStateToDefault();
    doMyDrawing();
    restoreOpenGLState(state);
}

MyOpenGLStatesaveOpenGLState(state)setStateToDefault()restoreOpenGLState(state)应该是什么样的,以确保doMyDrawing能够正确行事,而我doMyDrawing无法做到{{1}} 1}}会影响第三方开发者可能正在做的其他事情吗?

一直困扰我的问题是OpenGL有很多隐式状态,我不确定我是否正在捕获它。

更新:我主要担心的是OpenGL ES 2.0,但我想我会更普遍地提出这个问题

3 个答案:

答案 0 :(得分:1)

不要使用framebuffer对象来渲染纹理。而是创建一个新的EGLContext和EGLSurface。然后,您可以使用eglBindTexImage将EGLSurface转换为纹理。通过这种方式,您可以保证来自doMyDrawing的状态不会污染主要的上下文,反之亦然。

答案 1 :(得分:0)

至于保存和恢复,glPushAttribglPopAttrib会让您走得更远。

但是,您无法将GL恢复为默认状态。但是,由于doMyDrawing()仅使用和/或修改了您应该知道的状态,因此您只需将其设置为您需要的值即可。

答案 2 :(得分:0)

这很大程度上取决于你在doMyDrawing();上做了什么,但基本上你必须恢复你在这个功能中改变的一切(所有状态)。如果不了解doMyDrawing();内部的情况,就无法猜出你需要恢复的内容。

如果在doMyDrawing()内对投影或模型视图矩阵进行了修改,请记得最初将GL_PROJECTIONGL_MODELVIEW矩阵推送到glPushMatrix并在绘图后恢复它们通过glPopMatrix。您修改的任何其他状态都可以通过glPushAttrib和右侧属性进行推送和弹出。还记得取消绑定你可能绑定在doMyDrawing();

内的任何纹理,FBO,PBO等。