2012-09-18 180 views
5

我想编写一个通用的实用程序函数,它将使用OpenGL帧缓冲区对象创建一个可被某些OpenGL程序用于第三方程序员所需的任何目的的纹理。恢复OpenGL状态

比方说,为了论证股权函数看起来像

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

我应该MyOpenGLStatesaveOpenGLState(state)setStateToDefault()restoreOpenGLState(state)模样,以确保doMyDrawing将正确的行为,并没有什么,我在doMyDrawing做会影响别的第三方开发者可能在做什么?

一直困扰着我的问题是OpenGL有很多隐式状态,我不确定我是否捕获了所有这些。

更新:我主要关心的是OpenGL ES 2.0的,但我想我会更普遍

回答

1

不要使用framebuffer对象来渲染纹理。而是创建一个新的EGLContext和EGLSurface。然后,您可以使用eglBindTexImage将您的EGLSurface转换为纹理。这样你就可以保证从doMyDrawing的状态不会污染主要背景,反之亦然。

0

问这样的问题对于保存和恢复,glPushAttribglPopAttrib将让你很远。

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

+2

是不是被弃用? – KillianDS

+0

这个问题主要涉及OpenGL ES 2.0,它既不是'glPushAttrib'也不是'glPopAttrib'是其一部分(参见http://www.khronos.org/opengles/sdk/docs/man/)。 – Caterpillar

0

这取决于你在doMyDrawing();上做了什么,但基本上你必须恢复所有(所有状态),你在这个功能中改变。如果没有看看doMyDrawing();里面发生了什么,就不可能猜测你需要恢复什么。

如果投影或模型视图矩阵修改里面doMyDrawing()完成后,记得要首先通过glPushMatrix推动双方GL_PROJECTIONGL_MODELVIEW矩阵,并通过glPopMatrix绘图后恢复它们。您修改的任何其他状态都可以通过glPushAttrib和正确的属性进行推送和弹出。还请记住解除绑定任何纹理,FBO,PBO等,你可能绑定在doMyDrawing();

+1

请注意,OpenGLES 2.0中不存在glPush/Pop * – Tim