2012-06-28 11 views
7

FBOを作成し、それをiOSアプリケーションのテクスチャとして使用する際に問題があります。私は問題を示しているgithubに私のアプリの削除版をアップロードしました。私は決して設定しない奇妙な色の空白の画面が表示されます。ステータスを確認すると、FBOが正常に作成されたことが示されます。iOS上でOpenGL ES 2.0を使用してFBOを作成するための最小の例

https://github.com/glman74/simpleFBO

は、私はすでに、関連stackoverflowの質問を見て、としている。具体的GLUTを使ってFBOを設定する方法を示していますが、シェーダを使用していないdatenwolfから下のリンク。私はまだ私が間違っていることを確信していません。

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_DRAW_FRAMEBUFFER_APPLEの代わりにGL_FRAMEBUFFERを使用して試しました。また、欠落していたバインドテクスチャ呼び出しを追加しました。まだ動作しません。

編集#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

関連する問題