6

我想编写一个通用实用程序函数,它将使用 OpenGL 帧缓冲区对象来创建一个纹理,该纹理可由某些 OpenGL 程序用于第三方程序员想要的任何目的。

让我们说参数权益函数看起来像

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

应该如何确保其行为正确并且我所做的MyOpenGLState任何 事情都不会影响第三方开发人员可能正在做的任何其他事情?saveOpenGLState(state)setStateToDefault()restoreOpenGLState(state)doMyDrawingdoMyDrawing

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

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

4

3 回答 3

2

不要使用帧缓冲区对象来渲染纹理。而是创建一个新的 EGLContext 和 EGLSurface。然后,您可以使用eglBindTexImage将 EGLSurface 转换为纹理。这样你就可以保证 state fromdoMyDrawing不会污染主 gl 上下文,反之亦然。

于 2012-09-18T16:44:45.303 回答
1

至于保存和恢复,glPushAttrib会让glPopAttrib你走得很远。

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

于 2012-09-18T12:33:46.303 回答
0

这在很大程度上取决于doMyDrawing();您对. 如果不看里面发生了什么,就不可能猜出你必须恢复什么。doMyDrawing();

如果对投影或模型视图矩阵的修改是在内部完成的doMyDrawing(),请记住最初将它们GL_PROJECTIONGL_MODELVIEW矩阵都推入并glPushMatrix在绘制完成后恢复它们glPopMatrix。您修改的任何其他状态都可以是 push 和 popglPushAttrib以及正确的属性。还要记住取消绑定任何可能在 doMyDrawing() 中绑定的纹理、FBO、PBO 等。

于 2012-09-18T13:43:44.693 回答