0

我正在尝试实现这一点:我有一个自定义帧缓冲区,我在其中渲染了一些几何图形。FBO 在那一刻有一个颜色附件纹理。然后我将它复制到 PBO 中。之后我想从 PBO 复制回像素进入该纹理并将自定义FBOblit到默认帧缓冲区中。它不起作用。

我更新了代码,使其更易于理解:

   // 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

如果您取出帧缓冲区回读,它会起作用吗?

我不确定你为什么觉得有必要在这里使用 PBO?通常,只有当您的源或目标不在显卡上时,PBO 才会有好处。

考虑到 FBO 可以直接绑定到纹理句柄,以获得渲染到纹理的能力。(http://www.songho.ca/opengl/gl_fbo.html#example)。如果那只鞋合适,您可以用绘制一个带纹理的四边形替换 glBlitFrameBuffer()。

此外,考虑使用 glCopyTexSubImage2D() 将像素从帧缓冲区直接读取到纹理对象中。

于 2013-02-26T18:57:59.413 回答
0

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

于 2013-03-20T09:16:44.980 回答