我正在努力实现这个目标: 我有一个自定义帧缓冲区,我在其中渲染一些几何体.FBO在那一刻有一个颜色附件纹理。然后我将它复制到PBO。之后,我想将PBO中的像素复制回该纹理并blit自定义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返回到目标纹理,然后将再次渲染到屏幕。
答案 0 :(得分:0)
如果取出帧缓冲读回功能,它会起作用吗?
我不确定为什么你觉得有必要在这里使用PBO?一般来说,只有当您的源或目的地不在显卡上时,PBO才会有好处。
考虑到FBO可以直接绑定到纹理句柄,用于渲染到纹理功能。 (http://www.songho.ca/opengl/gl_fbo.html#example)。如果那只鞋适合,你可以用绘制纹理四边形替换glBlitFrameBuffer()。
另外,考虑使用glCopyTexSubImage2D()将帧缓冲区中的像素直接读入纹理对象。
答案 1 :(得分:0)
我认为你可以在你的cuda操作之后将像素从pbo绘制到默认的帧缓冲区。