如果指定了GL_COLOR_BUFFER_BIT掩码,glBlitFrameBuffer是否复制所有颜色附件?

lzfw57am  于 2022-09-26  发布在  其他
关注(0)|答案(2)|浏览(149)

如果我要将像素从一个FBO复制到另一个FBO,并且每个像素都有多个(不必相同数量)的颜色附件,并且如果我的掩码是GL_COLOR_BUFFER_BIT,它会复制哪种颜色附件(GL_COLOR_ATTACHMENT0GL_COLOR_ATTACHMENT1、...、GL_COLOR_ATTACHMENTi)?所有人都是吗?如果是,如果这些FBO附加了不同数量的颜色缓冲区,该怎么办?

假设有2个FBO以这种方式绑定:

glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo1); 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo2);

请注意,fbo1有2个彩色附件,fbo2有4个彩色附件。

那么在这种情况下,glBlitFrameBuffer Blit彩色附件是如何实现的呢?

我在OpenGL文档中找不到这一点。

lrpiutwd

lrpiutwd1#

帧缓冲区颜色漂移操作将GL_READ_FRAMEBUFFER的当前glReadBuffer读取,并且写入为GL_DRAW_FRAMEBUFFER指定的glDrawBuffers。因此,这与附件无关;它与两个帧缓冲区的读取和绘制缓冲区有关。

omqzjyyz

omqzjyyz2#

这是一个老主题,但我最近遇到了同样的问题。之前接受的答案仍然有效,但您必须在blit操作之后恢复读/写缓冲区,因为这是帧缓冲区状态的一部分。

对于那些使用OpenGL 4.5版和更高版本的用户,您可以利用新的Direct State Access功能,而不是使用glBlitNamedFramebuffer,这将为我们提供一个更干净的解决方案。有了NamedFramebuffer,我们就可以访问和修改读/写缓冲区,而不必绑定帧缓冲区,因此不会更改任何状态。

// transfer pixels data between color attachments
glNamedFramebufferReadBuffer(in, GL_COLOR_ATTACHMENT0 + in_buff_id);
glNamedFramebufferDrawBuffer(out, GL_COLOR_ATTACHMENT0 + out_buff_id);
glBlitNamedFramebuffer(in, out, 0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST);

// transfer pixels data between depth buffers
glBlitNamedFramebuffer(in, out, 0, 0, width, height, 0, 0, width, height, GL_DEPTH_BUFFER_BIT, GL_NEAREST);

// transfer pixels data between stencil buffers
glBlitNamedFramebuffer(in, out, 0, 0, width, height, 0, 0, width, height, GL_STENCIL_BUFFER_BIT, GL_NEAREST);

虽然我还没有测试性能,但差别应该很小(希望如此)。

相关问题