20

如果我将像素从一个 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 个颜色附件和fbo24 个颜色附件。

那么glBlitFrameBuffer在这种情况下,blit 颜色附件如何?

我在 OpenGL 文档中的任何地方都找不到这个。

4

2 回答 2

21

帧缓冲区颜色块操作只会从的当前读取,并且只会写入指定. 所以这与附件无关;这是关于两个帧缓冲区的读取和绘制缓冲区。glReadBufferGL_READ_FRAMEBUFFERglDrawBuffersGL_DRAW_FRAMEBUFFER

于 2013-07-17T05:31:28.827 回答
1

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

对于那些使用 OpenGL 4.5 及更高版本的人,您可以利用新的直接状态访问功能来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);

我还没有测试过性能,但差异应该是微不足道的(希望如此)。

于 2021-09-30T06:03:12.123 回答