0

OpenGL を使用して、同時に複数のプロセスでレンダリングできる必要があります。

FBO を使用してテクスチャにレンダリングしています。その1つのプロセス(タイルレンダリング)で、glGetTexImage()でピクセルを複数回読み取ります。

次に、同時に実行する複数のプログラムを起動しましたが、機能する場合と機能しない場合があることに気付きました。画像全体が破損する (1 つのタイルのみを繰り返す) 場合もあれば、一部のみが破損する場合もあります。また、4096x4096 サイズの FBO テクスチャが何らかの理由で使用できず、そのテクスチャ サイズによるエラーが、この「一度に複数のプロセス」のタイリング エラーと同じであることに以前気付きました。プログラムがまだ完全にレンダリングされていないテクスチャを取得しようとしていますか? また、使用するテクスチャが小さいほど、同時に実行できるプロセスが増えることにも気付きました。私のGFXカードのメモリは256MBだと思います。しかし、1024x1024 サイズのテクスチャ サイズの 8 つのプロセスでも、最悪でも 33 MB のメモリしか使用しないため、GFX カードのメモリ制限にはなりません。

タイリング エラーは、新しいタイル ピクセル データを取得していないように見えるため、古いバッファを再度使用します。

レンダリングの破損を防ぐにはどうすればよいですか?

これが私のレンダリングコードの構造です:

for(y...){
    for(x...){
        // set viewport & translatef

        glBindFramebuffer(GL_FRAMEBUFFER, fboId);
        // glclear()
        render_tile();
        glFlush();
        glBindFramebuffer(GL_FRAMEBUFFER, 0);

        glBindTexture(GL_TEXTURE_2D, textureId);
        glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels);
        glBindTexture(GL_TEXTURE_2D, 0);
        copy_tile_pixels_to_output_image();
    }
}

FBO の初期化は次のとおりです (opengl 関連のコマンドのみが表示されます)。

// texture:
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, 0);

// FBO:
glGenFramebuffers(1, &fboId);
glBindFramebuffer(GL_FRAMEBUFFER, fboId);

glGenRenderbuffers(1, &rboId);
glBindRenderbuffer(GL_RENDERBUFFER, rboId);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL, TEXTURE_WIDTH, TEXTURE_HEIGHT);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboId);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rboId);

checkFramebufferStatus(); // will exit if errors found. none found, however.

glBindFramebuffer(GL_FRAMEBUFFER, 0);

編集: datenwolf が気付いたように、glReadPixels() を使用すると問題は解決します。しかし、私はまだその理由がわからないので、フードの下で何が起こっているのかを知り、将来的にそのようなエラーが発生しないことを確認することをお勧めします!

4

1 に答える 1

0

FBO自体は、独自のバッキングイメージストレージを持たない単なる抽象的なオブジェクトです。基本的に、FBO自体は、イメージシンクとソースを接続できるスロットのみで構成されます。テクスチャはそのように機能することができますが、同じ目的を果たすレンダリングバッファもありますが、テクスチャのサンプルソースとして使用することはできません。

glReadPixelsを使用して、バインドされたFBOから直接読み戻すことができます。

于 2012-09-13T17:21:36.163 に答える