2009-04-19 14 views
7

glReadPixels()をレンダリングしてから読み取る色と奥行きのある添付ファイルを持つFBOオブジェクトがあり、マルチサンプリングのサポートを追加しようとしています。
glRenderbufferStorage()の代わりに、私はglRenderbufferStorageMultisampleEXT()をカラーアタッチメントと深さアタッチメントの両方に呼び出しています。フレームバッファオブジェクトは正常に作成されたと思われ、完了としてレポートされます。
レンダリング後、私はglReadPixels()でそれを読むことを試みています。サンプル数が0の場合、マルチサンプリングが無効になると完全に機能し、必要な画像が得られます。サンプル数を何か他の値、例えば4に設定しても、フレームバッファはまだ構築されていますが、は失敗します。INVALID_OPERATIONFBOのglReadPixelsがマルチサンプリングで失敗する

ここで何が間違っているのでしょうか?

EDIT:glReadPixelsのコード:

glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, ptr); 

PTRポイント幅*高さするuintのアレイです。

+0

あなたのglReadPixelsのフルライン()の呼び出し(フォーマット、タイプなど)を投稿することができますか? –

答えて

23

glReadPixels()でマルチサンプルFBOから読み込むことはできません。マルチサンプリングされたFBOから通常のFBOにブリットし、通常のFBOをバインドしてから、通常のFBOからピクセルを読み取る必要があります。このような

何か:

// Bind the multisampled FBO for reading 
glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, my_multisample_fbo); 
// Bind the normal FBO for drawing 
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, my_fbo); 
// Blit the multisampled FBO to the normal FBO 
glBlitFramebufferEXT(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST); 
//Bind the normal FBO for reading 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, my_fbo); 
// Read the pixels! 
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 
+0

"私はあなたがマルチサンプルから読むことができるとは思わない" - その参考資料はありますか? – shoosh

+2

ここで(下にスクロールします):http://www.opengl.org/wiki/GL_EXT_framebuffer_multisample –

+0

'my_fbo'をblitに初期化するには? –

1

それはGL_INVALID_OPERATIONエラーを引き上げるので、あなたはglReadPixelsと直接マルチサンプルバッファを読み取ることができません。 GPUがダウンサンプルを行うことができるように、別のサーフェスにblitする必要があります。バックバッファにblitできますが、 "pixel owner ship test"の問題があります。別のFBOを作るのが最善です。別のFBOを作ったとしましょう。今度はblitが必要です。これにはGL_EXT_framebuffer_blitが必要です。通常、ドライバがGL_EXT_framebuffer_multisampleをサポートする場合、GL_EXT_framebuffer_blit、たとえばnVidia Geforce 8シリーズもサポートします。

//Bind the MS FBO 
glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, multisample_fboID); 
//Bind the standard FBO 
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fboID); 
//Let's say I want to copy the entire surface 
//Let's say I only want to copy the color buffer only 
//Let's say I don't need the GPU to do filtering since both surfaces have the same dimension 
glBlitFramebufferEXT(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST); 
//-------------------- 
//Bind the standard FBO for reading 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboID); 
glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, pixels); 

出典:GL EXT framebuffer multisample

関連する問題