2012-06-28 13 views
7

Tengo problemas para crear un FBO y luego usarlo como textura en mi aplicación iOS. He subido una versión reducida de mi aplicación en github, que muestra el problema. Solo tengo una pantalla en blanco con un color extraño que nunca configuré. El estado de comprobación muestra que el FBO se creó con éxito.Ejemplo mínimo para crear FBO usando OpenGL ES 2.0 en iOS

https://github.com/glman74/simpleFBO

ya he mirado preguntas relacionadas stackoverflow, y específicamente el siguiente enlace de datenwolf que muestra cómo configurar una OBF utilizando GLUT, pero no utiliza shaders. Todavía no estoy seguro de lo que estoy haciendo mal.

https://github.com/datenwolf/codesamples/blob/master/samples/OpenGL/minimalfbo/

También estoy aquí anexar partes pertinentes del Código. En el método renderFBO, solo estoy haciendo un claro. Hubiera esperado que esta textura de color sólido (verde) se usara cuando renderizo el polígono en el render principal.

OBF configuración:

// intialize FBO 
- (void)setupFBO 
{ 
    fbo_width = 512; 
    fbo_height = 512; 

    glGenFramebuffers(1, &fboHandle); 
    glGenTextures(1, &fboTex); 
    glGenRenderbuffers(1, &depthBuffer); 

    glBindFramebuffer(GL_FRAMEBUFFER, fboHandle); 

    glBindTexture(GL_TEXTURE_2D, fboTex); 
    glTexImage2D(GL_TEXTURE_2D, 
       0, 
       GL_RGBA, 
       fbo_width, fbo_height, 
       0, 
       GL_RGBA, 
       GL_UNSIGNED_BYTE, 
       NULL); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER_APPLE, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fboTex, 0); 

    glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24_OES, fbo_width, fbo_height); 
    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_APPLE, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer); 

    // FBO status check 
    GLenum status; 
    status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
    switch(status) { 
     case GL_FRAMEBUFFER_COMPLETE: 
      NSLog(@"fbo complete"); 
      break; 

     case GL_FRAMEBUFFER_UNSUPPORTED: 
      NSLog(@"fbo unsupported"); 
      break; 

     default: 
      /* programming error; will fail on all hardware */ 
      NSLog(@"Framebuffer Error"); 
      break; 
    } 

    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
} 

OBF imagen:

// render FBO 
- (void)renderFBO 
{ 
    glBindTexture(GL_TEXTURE_2D, 0); 
    glEnable(GL_TEXTURE_2D); 
    glBindFramebuffer(GL_FRAMEBUFFER, fboHandle); 

    glViewport(0,0, fbo_width, fbo_height); 
    glClearColor(0.0f, 1.0f, 0.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
} 

principal Render:

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect 
{ 
    // render FBO tex 
    [self renderFBO]; 

    glViewport(0, 0, self.view.bounds.size.width, self.view.bounds.size.height); 
    // render main 
    glClearColor(0.65f, 0.65f, 0.65f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glEnable(GL_TEXTURE_2D); 
    glActiveTexture(GL_TEXTURE0); 

    glUniform1i(uSamplerLoc, 0);  
    // Render 
    glUseProgram(_program); 

    glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m); 
    glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m); 

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

    glDisable(GL_TEXTURE_2D); 
} 

Una idea sobre lo que podría estar haciendo mal?

Edición # 1:

he hecho algunos pequeños cambios a mi código en GitHub. Intenté usar GL_FRAMEBUFFER en lugar de GL_DRAW_FRAMEBUFFER_APPLE arriba. También se agregó una llamada de textura de enlace, que faltaba. Aún no funciona.

Edit # 2:

Encontré una solución. Necesitaba llamar al render principal:

// reset to main framebuffer 
[((GLKView *) self.view) bindDrawable];  

Respuesta

9

Encontré una solución, y he actualizado el código a continuación en caso de que sea útil para alguien.

https://github.com/glman74/simpleFBO/

El principal problema es que tenía que llamar a render principal:

// reset to main framebuffer 
[((GLKView *) self.view) bindDrawable]; 

Esto se debe a que estaba usando GLKView. La situación es diferente de los ejemplos CAEAGLLayer.

+1

Gracias, su ejemplo realmente me ayudó. Si alguien tiene un error de compilación con GL_DEPTH_COMPONENT24_OES reemplácelo con GL_DEPTH_COMPONENT16 – LightMan

Cuestiones relacionadas