PBO 2方式复制来自同一个FBO纹理附件

我试图做到这一点:我有一个自定义帧缓冲区,我渲染一些几何图形。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中将其重新渲染回目标纹理,然后再将其渲染到屏幕上。


如果你取出framebuffer回读,它会起作用吗?

我不确定你为什么觉得有必要在这里使用PBO? 一般来说,只有当您的源或目的地不在图形卡上时,PBO才会有用。

考虑到FBO可以直接绑定到纹理句柄,用于渲染到纹理功能。 (http://www.songho.ca/opengl/gl_fbo.html#example)。 如果该鞋适合,则可以用绘制纹理四边形替换glBlitFrameBuffer()。

另外,请考虑使用glCopyTexSubImage2D()将帧缓冲区中的像素直接读入纹理对象。


我认为你可以在你的cuda操作后从pbo中将像素绘制到默认的帧缓冲区。

链接地址: http://www.djcxy.com/p/45735.html

上一篇: PBO 2 way copy from and into the same FBO texture attachment

下一篇: OpenGL PBO for texture upload, can't understand one thing