2012-02-12 9 views
6

マルチサンプリングされたシーンをテクスチャにレンダリングしようとしていますが、これは私が使用しているコードです。私は黒い画面を取得しています。私はinitの最後にfboの完全性をチェックし、両方のfboが完全であると報告します。FBOのブリッジングが機能しない

void init_rendered_FBO() { 
    glGenFramebuffers(1,&fbo); 
    glBindFramebuffer(GL_FRAMEBUFFER, fbo); 
    glGenTextures(1,&fbo_tex); 
    glBindTexture(GL_TEXTURE_2D, fbo_tex); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width_screen, height_screen, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
    glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, width_screen, height_screen); 
    glBindTexture (GL_TEXTURE_2D, 0); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo_tex, 0); 
    int objectType; 
    glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE,&objectType); 
    ASSERT(objectType == GL_TEXTURE); 
    int objectName; 
    glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME,&objectName); 
    ASSERT(glIsTexture(objectName) == GL_TRUE); 
    int wid, hei, fmt; 
    glBindTexture(GL_TEXTURE_2D, objectName); 
    glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &wid); 
    glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &hei); 
    glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, 
      &fmt); 
    glBindTexture(GL_TEXTURE_2D, 0); 
    std::string format = convertInternalFormatToString(fmt); 
    std::cout << "Color attachment 0: " << objectName << " " << wid << "x" << hei << ", " << format << std::endl; 
    ASSERT(checkFramebufferStatus()); 
    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
} 

// this is the init function that gets called. 
void init_rendered_multisample_FBO() { 
    init_rendered_FBO(); 
    // now I'm going to set up the additional component necessary to perform multisampling which is a new fbo 
    // that has a multisampled color buffer attached. I won't need a multisample depth buffer. 
    glGenFramebuffers(1,&multi_fbo); 
    glBindFramebuffer(GL_FRAMEBUFFER,multi_fbo); 
    glGenRenderbuffers(1,&renderbuffer_multi); 
    glBindRenderbuffer(GL_RENDERBUFFER,renderbuffer_multi); 
    glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA, width_screen,height_screen); 
    glBindRenderbuffer(GL_RENDERBUFFER,0); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer_multi); 
    int objectType; 
    glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE,&objectType); 
    ASSERT(objectType == GL_RENDERBUFFER); 
    int objectName; 
    glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME,&objectName); 
    ASSERT(glIsRenderbuffer(objectName) == GL_TRUE); 
    glBindRenderbuffer(GL_RENDERBUFFER,objectName); 
    int wid,hei,fmt,sam; 
    glGetRenderbufferParameteriv(GL_RENDERBUFFER,GL_RENDERBUFFER_WIDTH,&wid); 
    glGetRenderbufferParameteriv(GL_RENDERBUFFER,GL_RENDERBUFFER_HEIGHT,&hei); 
    glGetRenderbufferParameteriv(GL_RENDERBUFFER,GL_RENDERBUFFER_INTERNAL_FORMAT,&fmt); 
    glGetRenderbufferParameteriv(GL_RENDERBUFFER,GL_RENDERBUFFER_SAMPLES,&sam); 
    glBindRenderbuffer(GL_RENDERBUFFER,0); 
    printf("Renderbuffer: %dx%d, fmt=%d, samples=%d\n",wid,hei,fmt,sam); 
    ASSERT(checkFramebufferStatus()); 
    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
} 
// this is called after rendering to multi_fbo 
void resolve_multisample_FBO() { 
    glBindFramebuffer(GL_READ_FRAMEBUFFER, multi_fbo); 
    glReadBuffer(GL_COLOR_ATTACHMENT0); 
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); 
    GLenum drawbuf = GL_COLOR_ATTACHMENT0; 
    glDrawBuffers(1,&drawbuf); 
    glBlitFramebuffer(0,0,width_screen,height_screen,0,0,width_screen,height_screen,GL_COLOR_BUFFER_BIT,GL_NEAREST); 
} 

私が残したものを見つけることができますか?問題はglFramebufferRenderbufferコールである可能性があります。私はGL_READ_FRAMEBUFFERに最初の引数を切り替えてみましたが、修正されませんでした。

glGetErrorを確認してください。エラーはありません。私が何か間違ってセットアップした場合は、確かに何かが失敗し、INVALID_ENUMまたはINVALID_OPERATIONと私に問題の絞り込みに役立ちます。

私がこのコードを使用する方法は、マルチサンプリングを有効にするために、私が変更しなければならないのは、描画するときにmulti_fboをバインドし、バインドしてblitするresolve関数を呼び出すことです。その後、私のfboテクスチャ(これに直接レンダリングするとうまくいく)にマルチサンプルレンダリングが含まれているはずです。しかしそれはただの黒です。また、glEnable(GL_MULTISAMPLE)を初期化コードの別の部分に呼び出しました。

マルチサンプルされていないテクスチャを別のテクスチャにblitしようとしています。うまくいけば、それは私がうんざりした場所を絞り込むのに役立ちます。

更新:それで、通常のFBOを別の同一のFBOにコピーすると(同じ色の添付ファイルにテクスチャが付いている)、同じ黒い画面が表示されます。 blitは単純に機能しません。

奇妙なことは、いったんblitしようとすると、SOURCE fboのテクスチャを描画することです。それはまだすべて黒です。それは、すべてを破壊するだけのことをしようとするようなものです。

誰かがFBOのコードを知っているのですか?私は何も見つけることができませんが、私は人々がマルチサンプルFBOの仕事を得た知っている。

は、ここであなたが助けることができる方法は次のとおりです。あなたが任意の時点でglBlitFramebufferを呼び出すコードをお持ちの場合、私はその動作までを設定するための他の呼び出しを見てみたいです。私は一度それを呼び出すと、黒いバッファとテクスチャ以外何も得られないようです。

更新:マルチサンプリングの場合でも、Blit to backbuffer works!これはもちろん、フレームバッファ0をバインドするだけなので、セットアップはまったく必要ありません。だから問題は私がblitされるはずのテクスチャアタッチメントを持っているFBOを設定しているようです。

答えて

4

フレームバッファのバインディングをリセットしない以外は何もしませんでした。

void resolve_multisample_FBO()の終わりに、私は単純に3時間を無駄にするglBindFramebuffer(GL_FRAMEBUFFER, 0);

恐ろしい方法が必要でした、私はあなたを保証します。しかし、マルチサンプリングは素晴らしく、それを補う以上のものです。