这是一个老话题,但我最近遇到了同样的问题。先前接受的答案仍然有效,但是您必须在 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);
我还没有测试过性能,但差异应该是微不足道的(希望如此)。