我想编写一个通用实用程序函数,它将使用OpenGL Framebuffer对象创建一个纹理,某些OpenGL程序可以将其用于第三方程序员想要的任何目的。
让我们说,对于参数桩,该函数看起来像
void createSpecialTexture(GLuint textureID)
{
MyOpenGLState state;
saveOpenGLState(state);
setStateToDefault();
doMyDrawing();
restoreOpenGLState(state);
}
MyOpenGLState
,saveOpenGLState(state)
,setStateToDefault()
和restoreOpenGLState(state)
应该是什么样的,以确保doMyDrawing
能够正确行事,而我doMyDrawing
无法做到{{1}} 1}}会影响第三方开发者可能正在做的其他事情吗?
一直困扰我的问题是OpenGL有很多隐式状态,我不确定我是否正在捕获它。
更新:我主要担心的是OpenGL ES 2.0,但我想我会更普遍地提出这个问题
答案 0 :(得分:1)
不要使用framebuffer对象来渲染纹理。而是创建一个新的EGLContext和EGLSurface。然后,您可以使用eglBindTexImage
将EGLSurface转换为纹理。通过这种方式,您可以保证来自doMyDrawing
的状态不会污染主要的上下文,反之亦然。
答案 1 :(得分:0)
至于保存和恢复,glPushAttrib
和glPopAttrib
会让您走得更远。
但是,您无法将GL恢复为默认状态。但是,由于doMyDrawing()
仅使用和/或修改了您应该知道的状态,因此您只需将其设置为您需要的值即可。
答案 2 :(得分:0)
这很大程度上取决于你在doMyDrawing();
上做了什么,但基本上你必须恢复你在这个功能中改变的一切(所有状态)。如果不了解doMyDrawing();
内部的情况,就无法猜出你需要恢复的内容。
如果在doMyDrawing()
内对投影或模型视图矩阵进行了修改,请记得最初将GL_PROJECTION
和GL_MODELVIEW
矩阵推送到glPushMatrix
并在绘图后恢复它们通过glPopMatrix
。您修改的任何其他状态都可以通过glPushAttrib
和右侧属性进行推送和弹出。还记得取消绑定你可能绑定在doMyDrawing();