3

さて、私はここでPBOについてのすべてを読みました:http ://www.opengl.org/wiki/Pixel_Buffer_Object そしてそこにhttp://www.songho.ca/opengl/gl_pbo.html、しかし私はまだ質問があり、私はしません私の場合、PBOから何らかの利益が得られるかどうかはわかりません:

私はビデオストリーミングを行っています。現在、データバッファを3つの異なるテクスチャにコピーする機能があり、フラグメントシェーダーでいくつかの計算を行って、テクスチャを表示しています。

PBOはアップロード時間をCPU->GPUに増やすことができると思いましたが、ここでは、上記の2番目のリンクからこの例を取得したとしましょう。

glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pboIds[nextIndex]);

        // map the buffer object into client's memory
        // Note that glMapBufferARB() causes sync issue.
        // If GPU is working with this buffer, glMapBufferARB() will wait(stall)
        // for GPU to finish its job. To avoid waiting (stall), you can call
        // first glBufferDataARB() with NULL pointer before glMapBufferARB().
        // If you do that, the previous data in PBO will be discarded and
        // glMapBufferARB() returns a new allocated pointer immediately
        // even if GPU is still working with the previous data.
        glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, DATA_SIZE, 0, GL_STREAM_DRAW_ARB);
        GLubyte* ptr = (GLubyte*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB);
        if(ptr)
        {
            // update data directly on the mapped buffer
            updatePixels(ptr, DATA_SIZE);
            glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB); // release pointer to mapping buffer
        }

        // measure the time modifying the mapped buffer
        t1.stop();
        updateTime = t1.getElapsedTimeInMilliSec();
        ///////////////////////////////////////////////////

        // it is good idea to release PBOs with ID 0 after use.
        // Once bound with 0, all pixel operations behave normal ways.
        glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);

さて、updatePixels関数の動作が何であれ、マップされたバッファにデータをコピーするためにCPUサイクルを使用していますね。

したがって、PBOをそのような方法で使用したいとします。つまり、関数でフレームピクセルをPBOに更新してから、関数でdisplayglTexSubImage2D(すぐに戻るはずです)を呼び出します...速度はわかりますか-パフォーマンスの面でアップ?なぜ高速になるのかわかりません...glTex*の呼び出し中はもう待機していませんが、フレームをPBOにアップロードする関数の間は待機していますね。

誰かが私のためにそれをクリアしてくれませんか?

ありがとう

4

1 に答える 1

5

バッファオブジェクトのポイントは、非同期で使用できることです。OpenGLコマンドを発行し続けることができる間、BOをマップしてから、プログラムの他の部分にそれを更新させることができます(スレッドを考え、非同期IOを考えます)。トリプルバッファリングされたPBOを使用した一般的な使用シナリオは、次のようになります。

wait_for_video_frame_load_complete(buffer[k-2])

glUnmapBuffer buffer[k-2]

glTexSubImage2D from buffer[k-2]

buffer[k] = glMapBuffer

start_load_next_video_frame(buffer[k]);

draw_texture

SwapBuffers

これにより、プログラムは有用な作業を実行し、レンダリングにも使用しながらOpenGLにデータをアップロードすることもできます。

于 2013-01-20T14:08:22.277 に答える