我正在尝试实现这一点:我有一个自定义帧缓冲区,我在其中渲染了一些几何图形。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 将其返回到目标纹理中,该纹理将再次渲染到屏幕上。