0

私はこれを達成しようとしています:いくつかのジオメトリをレンダリングするカスタムフレームバッファがあります。FBOにはその時点でカラーアタッチメントテクスチャがあります。次にそれをPBOにコピーします。その後、PBOからピクセルをコピーして戻します。そのテクスチャに追加し、カスタムFBOをデフォルトのフレームバッファにブリットします。これは機能しません。

私がしていることに関してより理解しやすいようにコードを更新しました:

   // Here I init the PBO :

   void Init(const int bufferWidth,const int bufferHeight){


    glGenBuffers(1,&_imagePBO);

    glBindBuffer(GL_PIXEL_PACK_BUFFER, _imagePBO);
    glBufferData(GL_PIXEL_PACK_BUFFER, bufferWidth * bufferHeight * 4,0, GL_DYNAMIC_COPY);
    glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);

}
   //Inside Render loop:

          _fboA.BindForWrite();
    glClear(GL_COLOR_BUFFER_BIT);
    glViewport(0,0, _viewportWidth,_viewportHeight);
     //================== RENDER SOME GEOMETRY  =======================//
    ..............
            .........................

 //===============READ from texture into PBO=======================// 
    _fboA.BindForRead();
            glBindBuffer(GL_PIXEL_PACK_BUFFER, *_exporter->GetPBOID());
    glReadPixels(400,400,_viewportWidth ,_viewportHeight,GL_RGBA,GL_UNSIGNED_BYTE,NULL);
    glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);

//=============== CLEAR TEXTURE IN FBO  to GREEN ===============//
    _fboA.BindForWrite();
    glClearColor(0,1,0,1);
    glClear(GL_COLOR_BUFFER_BIT);//|GL_DEPTH_BUFFER_BIT
    _fboA.Unbind();

//==================Read from PBO back into texture ===========//
    _texA->Bind();
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, *_exporter->GetPBOID());
        glTexSubImage2D(GL_TEXTURE_2D,100,100,0,_viewportWidth,_viewportHeight,
            GL_RGBA,GL_UNSIGNED_BYTE ,NULL);
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER,0);
    _texA->Unbind();
//======================== BLIT ===============================//
    _fboA.BindForRead();
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER , 0);
            glBlitFramebuffer(0,0,_viewportWidth,_viewportHeight,0,0,
           _viewportWidth,_viewportHeight,GL_COLOR_BUFFER_BIT,GL_LINEAR);

画面に表示されるのは緑色であり、_fboAからPBOにコピーしたと思われるレンダリングされたコンテンツではありません。

_fboAテクスチャがPBOからピクセルを取得しないか、PBOが_texAからピクセルを読み取らないようです。

さて、ここで指摘したように、このアプローチはOpenGLの観点からはおそらく最適ではありませんが、CUDAカーネルのリソースとしてPBOを共有するアプリケーションのCUDA部分には、この種のピンポンが必要です。

アップデート:

興味のある方のために、CUDA SDKのOpenGL相互運用機能のデモでは、テクスチャがCPUからPBOに入り、ターゲットテクスチャ2Dにコピーされる場合を示しています。私の場合、画像をFBOからPBOに取り込み、CUDAカーネルでの画像処理を介して渡し、PBOからターゲットテクスチャに戻します。これにより、画面に再度レンダリングされます。

4

2 に答える 2

0

Does it work if you take out the framebuffer read-back?

I'm not sure why you feel the need to use PBO here? Generally PBO is only going to be a benefit when your source or destination is not on the graphics card already.

Consider that the FBO can be bound to a texture handle directly, for render-to-texture capability. (http://www.songho.ca/opengl/gl_fbo.html#example). If that shoe fits, you could replace the glBlitFrameBuffer() with drawing a textured quad.

Also, consider using glCopyTexSubImage2D() to read pixels from frame buffer directly into a texture object.

于 2013-02-26T18:57:59.413 に答える
0

cuda操作の後、pboからデフォルトのフレームバッファにピクセルを描画できると思います。

于 2013-03-20T09:16:44.980 に答える