12

我可以使用像素缓冲区对象(PBO)直接从 FBO 读取像素值(即使用 glReadPixels)(即,当 FBO 仍然连接时)?

如是,

  1. 使用 PBO 和 FBO 的优缺点是什么?
  2. 以下代码有什么问题

{

//DATA_SIZE = WIDTH * HEIGHT * 3 (BECAUSE I AM USING 3 CHANNELS ONLY)
// FBO and PBO status is good
.
.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);
//Draw the objects

以下 glReadPixels 工作正常

glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE,  (uchar*)cvimg->imageData);

以下 glReadPixels 不起作用:(

glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pboId);
//yes glWriteBuffer has also same target and I also checked with every possible values
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); 
glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, (uchar*)cvimg->imageData);
.
.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); //back to window framebuffer
4

2 回答 2

10

当使用 PBO 作为目标时,glReadPixels您必须在缓冲区中指定一个字节偏移量(0我想)而不是(uchar*)cvimg->imageData作为目标地址。它类似于在glVertexPointer使用 VBO 时使用缓冲区偏移量。

编辑:当 PBO 绑定到 时GL_PIXEL_PACK_BUFFER,最后一个参数glReadPixels不被视为指向系统内存的指针,而是作为绑定缓冲区内存的字节偏移量。因此,要将像素写入缓冲区,只需传递一个 0(将它们写入缓冲存储器的开头)。然后,您可以稍后通过glMapBuffer. 您在评论中提供的示例链接也可以做到这一点,只需广泛阅读即可。我还建议阅读他们在开始时提到的关于顶点缓冲区对象的部分,因为这些为理解缓冲区对象奠定了基础。

于 2011-05-26T20:13:18.563 回答
9

是的,我们可以同时使用 FBO 和 PBO。

答案1:

对于同步读取:没有 PBO 的“glReadPixels”速度很快。

对于异步读取:具有 2/n 个 PBO 的“glReadPixels”更好——一个用于通过 GPU 将像素从帧缓冲区读取到 PBO (n),另一个用于通过 CPU 处理像素的 PBO (n+1)。不管快速不是授予的,它是问题和设计特定的。

答案 2:

Christian Rau 的解释是正确的,修改后的代码如下

glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pboId);
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
//glReadBuffer(GL_DEPTH_ATTACHMENT_EXT);

glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR, GL_UNSIGNED_BYTE, 0);

//GLubyte* src = (GLubyte*)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB);
//OR
cvimg->imageData = (char*) glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB);
if(cvimg_predict_contour->imageData)
{
  //Process src OR cvim->imageData
  glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);     // release pointer to the mapped buffer
}
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
于 2011-05-27T12:05:41.277 回答