2012-06-28 12 views
7

Ho difficoltà a creare un FBO e quindi a utilizzarlo come texture nella mia app iOS. Ho caricato una versione ridotta della mia app su github, che mostra il problema. Prendo solo uno schermo bianco con un colore strano che non ho mai impostato. Lo stato di controllo mostra che l'FBO è stato creato con successo.Esempio minimo per la creazione di FBO utilizzando OpenGL ES 2.0 su iOS

https://github.com/glman74/simpleFBO

Ho già guardato domande StackOverflow correlate, e in particolare sul link qui sotto da datenwolf che mostra come impostare un FBO utilizzando GLUT, ma non fa uso di shaders. Non sono ancora sicuro di cosa sto sbagliando.

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

Sono anche aggiungendo qui corrispondenti parti del codice. Nel metodo renderFBO, sto solo facendo una chiara. Mi sarei aspettato che questa texture a tinta unita (verde) venisse usata quando eseguo il rendering del poligono nel render principale.

FBO configurazione:

// 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); 
} 

FBO di rendering:

// 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); 
} 

principale 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); 
} 

Un idee su quello che potrebbe essere sbagliato?

Modifica # 1:

ho fatto alcune piccole modifiche al mio codice a github. Ho provato a utilizzare GL_FRAMEBUFFER anziché GL_DRAW_FRAMEBUFFER_APPLE sopra. Aggiunta anche una chiamata di texture vincolante, che mancava. Ancora non funziona.

Modifica n. 2:

Ho trovato una soluzione. Avevo bisogno di richiamare il rendering principale:

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

risposta

9

Trovato una soluzione, e ho aggiornato il codice di seguito nel caso in cui è utile per qualcuno.

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

Il problema principale è che avevo bisogno di chiamare principale render:

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

Questo perché stavo usando GLKView. La situazione è diversa dagli esempi CAEAGLLayer.

+1

Grazie, il tuo esempio mi ha davvero aiutato. Se qualcuno ha un errore di compilazione con GL_DEPTH_COMPONENT24_OES, sostituirlo con GL_DEPTH_COMPONENT16 – LightMan