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