2012-06-28 64 views
7

我在创建FBO时遇到问题,然后在iOS应用中将其用作纹理。我已经在github上上传了一个精简版的应用程序,它显示了这个问题。我只是一个空白的屏幕,我从来没有设置一个奇怪的颜色。检查状态显示FBO已成功创建。在iOS上使用OpenGL ES 2.0创建FBO的最小示例

https://github.com/glman74/simpleFBO

我已经看过相关的计算器问题,并专门从datenwolf以下链接展示了如何使用GLUT建立一个FBO,但不使用着色器。我仍然不确定我做错了什么。

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

我也追加这里的代码的相关部分。在renderFBO方法中,我只是在做清楚。我希望当我在主渲染中渲染多边形时,将使用这种纯色(绿色)纹理。

FBO设置:

// 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渲染:

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

主要渲染:

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

什么我可能是做错了的想法?

编辑#1:

我已经在github上做了一些小的改动我的代码。尝试使用GL_FRAMEBUFFER而不是上面的GL_DRAW_FRAMEBUFFER_APPLE。还添加了一个绑定纹理调用,这是缺少的。仍然不起作用。

编辑#2:

我找到了解决方案。我需要在主渲染中调用:

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

回答

9

找到了一个解决方案,我更新了下面的代码以防万一它对某人有用。

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

的主要问题是,我需要在主调用渲染:

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

这是因为我用GLKView。这种情况与CAEAGLLayer的例子不同。

+1

谢谢,你的例子真的帮了我。如果某人在GL_DEPTH_COMPONENT24_OES上发生编译错误,请将其替换为GL_DEPTH_COMPONENT16 – LightMan