小编Rud*_*udi的帖子

使用像素缓冲对象(PBO)从帧缓冲对象(FBO)读取像素值

我可以使用像素缓冲区对象(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
Run Code Online (Sandbox Code Playgroud)

以下glReadPixels工作正常

glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE,  (uchar*)cvimg->imageData);
Run Code Online (Sandbox Code Playgroud)

以下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
Run Code Online (Sandbox Code Playgroud)

opengl fbo framebuffer glreadpixels pbo

12
推荐指数
2
解决办法
2万
查看次数

帧缓冲对象(FBO)和渲染和深度缓冲关系

我在网上看到了很多例子(例如),它们做了以下工作

  • 创建并绑定FBO
  • 创建和绑定BUFFERS(纹理,渲染,深度,模板)
  • 然后,UnBind BUFFERS
  • 要与FBO-Bind FBO合作,请完成工作,然后取消绑定FBO
  • 但是,还有纹理BUFFER的Bind纹理BUFFER用于读取,写入等
  • 但是,从来没有看到其他BUFFERS(渲染,深度,模板)重新绑定,为什么?

BUFFERS创建和绑定/解除绑定的示例(下面的代码仅用于显示我解释并完美运行的内容),

// create a framebuffer object, you need to delete them when program exits.
glGenFramebuffersEXT(1, &fboId);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);

// create color buffer object and attached to fbo
glGenRenderbuffersEXT(1, &rboId);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rboId);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, TEXTURE_WIDTH, TEXTURE_HEIGHT);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); //UnBind

if(useDepthBuffer) {
  glGenRenderbuffersEXT(1, &rboIdDepth);
  glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rboIdDepth);
  glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, TEXTURE_WIDTH, TEXTURE_HEIGHT);
  glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); //UnBind
}

glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, rboId);
if(useDepthBuffer)
  glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, rboIdDepth);


// check FBO status
printFramebufferInfo();
bool …
Run Code Online (Sandbox Code Playgroud)

opengl buffer fbo framebuffer depth-buffer

3
推荐指数
1
解决办法
5915
查看次数

标签 统计

fbo ×2

framebuffer ×2

opengl ×2

buffer ×1

depth-buffer ×1

glreadpixels ×1

pbo ×1