iOS OpenGL ES - 在应用程序重新设置时将屏幕渲染到FBO以便稍后重绘

时间:2013-02-09 08:51:41

标签: ios opengl-es

我想将屏幕渲染为纹理,这样当我再次回到应用程序时,我就可以将纹理“粘贴”到屏幕上。 目前在我的应用程序中,我正在绘制一个kEAGLDrawablePropertyRetainedBacking设置为TRUE的波形。它可以工作,但是在我从我的应用程序中退出并再次返回后屏幕被清除。这是kEAGLDrawablePropertyRetainedBacking为TRUE的正常行为吗? 当我回到我的应用程序时,我无法承受fps重新绘制所有内容。

我已经偶然发现了这个问题:How to save and redraw screen content in OpenGL ES我正在尝试将答案应用到我的需求中,但我仍然遇到问题。

参考其他问题的答案,我试图这样做。

@property (nonatomic) GLuint framebuffer;
@property (nonatomic) GLuint texture;

glkviewcontroller中加载的代码。

- (void)viewDidLoad  {

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActive) name:UIApplicationWillResignActiveNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillTerminate) name:UIApplicationWillTerminateNotification object:nil];

    glGenFramebuffers(1, &_framebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER_OES, _framebuffer);


    glGenTextures(1, &_texture);

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, _texture);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 768, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

    glBindTexture(GL_TEXTURE_2D, 0);
    glDisable(GL_TEXTURE_2D);
.....

当通知此viewController应用程序正在重新签名时,我使用此功能:

 -(void)appWillResignActive
{
    glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, _texture, 0);
    if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
        NSLog(@"Error!");
}

检查上面的状态后,我仍然收到错误。 这可能是什么问题?我是OpenGL ES的新手,请原谅我,如果这是一个新手问题。谢谢。

1 个答案:

答案 0 :(得分:0)

没关系我在上下文初始化之前尝试了上面的纹理和帧缓冲区绑定。

    // Create an OpenGL ES 2.0 context and provide it to the
    // view
    view.context = [[AGLKContext alloc]
                    initWithAPI:kEAGLRenderingAPIOpenGLES2];
    view.delegate = self;

   // Make the new context current
   [AGLKContext setCurrentContext:view.context];

在此之后输入代码可以进行检查。