9

色と深さのアタッチメントが付いたFBOオブジェクトがあり、レンダリングしてから読み取り、glReadPixels()マルチサンプリングサポートを追加しようとしています。
代わりに、カラーアタッチメントとデプスアタッチメントの両方glRenderbufferStorage()を求めています。glRenderbufferStorageMultisampleEXT()フレームバッファオブジェクトは正常に作成されたようで、完了として報告されます。
レンダリングした後、私はそれから読み込もうとしていglReadPixels()ます。サンプル数が0の場合、つまりマルチサンプリングが無効になっている場合、完全に機能し、必要な画像が得られます。サンプル数を別の値、たとえば4に設定すると、フレームバッファーは正常に構築されますが、glReadPixels()失敗します。INVALID_OPERATION

誰かがここで何が間違っている可能性があるか考えていますか?

編集:glReadPixelsのコード:

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

ここで、ptrはwidth *heightuintsの配列を指します。

4

2 に答える 2

29

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);
于 2009-04-29T18:03:51.663 に答える
1

GL_INVALID_OPERATIONエラーが発生するため、glReadPixelsを使用してマルチサンプルバッファを直接読み取ることはできません。GPUがダウンサンプルを実行できるように、別のサーフェスにブリットする必要があります。バックバッファにブリットすることもできますが、「ピクセル所有者の出荷テスト」の問題があります。別のFBOを作成するのが最善です。別のFBOを作成し、ブリットが必要だとしましょう。これには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);

ソース:GLEXTフレームバッファマルチサンプル

于 2009-05-04T11:53:17.097 に答える