2

FBO からウィンドウのフレームバッファにコピーしようとしています。私の知る限り、ウィンドウフレームバッファはR、G、B、Aそれぞれ8ビットで、デプスバッファ(おそらく24ビット)を持っています。FBO には単一のテクスチャ アタッチメント (フォーマット RGBA8) があり、レンダー バッファーはありません。

問題は、FBO を画面にブリットしようとすると、アクセス違反 (SIGSEGV の Windows 用語) が発生することです。ブリットコード:

//Earlier: const int screen_rect[4] = {0,0,512,512};

glBindFramebuffer(GL_READ_FRAMEBUFFER,fbo->framebuffer);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,               0);
glFinish();
//checking GL errors here gives no error
glBlitFramebuffer(
    screen_rect[0],screen_rect[1],screen_rect[2],screen_rect[3],
    screen_rect[0],screen_rect[1],screen_rect[2],screen_rect[3],
    GL_COLOR_BUFFER_BIT,
    GL_NEAREST //EDIT: I've also tried GL_LINEAR
);
glFinish();
//never reaches here
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,0);
glBindFramebuffer(GL_READ_FRAMEBUFFER,0);

FBO は GL_FRAMEBUFFER_COMPLETE_EXT であり、どの時点でも GL エラーは発生しません。FBO とウィンドウ フレーム バッファーは同じサイズです。

NVIDIA GeForce 580M GTX とドライバー 301.42 (現在まで、最新) で実行。

なぜこれが起こっているのでしょうか?

[編集: データがコピーされていないように見えますが、FBO から別の FBO にブリットしても問題は発生しないことがわかりました]

4

1 に答える 1

1

この実装は、コマンドが入る順序について非常に慎重になっているようです。既存のコードをリバースエンジニアリングした後、次のことがわかりました。おそらく、それらがこの順序でなければならないいくつかの不可解な理由がありますが、私は何を知りません。

いずれにせよ、segfaultingの動作はNVIDIAのOpenGL実装のバグであると私は信じています。

さらに面倒なことをせずに、キーコマンドを順番に:

GLenum buffers1[] = {GL_BACK};
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,0);
glDrawBuffers(1,buffers1);

glBindFramebuffer(GL_READ_FRAMEBUFFER,fbo->framebuffer);
glReadBuffer(GL_COLOR_ATTACHMENT1);

glBlitFramebuffer(...)
于 2012-06-22T00:02:36.397 に答える