我想这是有可能的,因为:
glBindFramebuffer(GL_READ_FRAMEBUFFER_APPLE, _multisampleFramebuffer);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_APPLE, _framebuffer);
glResolveMultisampleFramebufferAPPLE();
正是这样做的,并且最重要的是解决了多重采样。但是,这是一个 Apple 扩展,我想知道是否有类似的东西可以将所有逻辑缓冲区从一个帧缓冲区复制到另一个帧缓冲区,并且不执行 vanilla 实现中的多重采样部分。
GL_READ_FRAMEBUFFER
似乎不是一个有效的目标,所以我猜没有直接的方法?解决方法如何?编辑:似乎可以使用
glCopyImageSubData
在 OpenGL 4 中,不幸的是不是在我的情况下,因为我在 iPhone 上使用 OpenGL ES 2.0,这似乎缺乏该功能。还有什么办法吗?
最佳答案
glBlitFramebuffer 完成您正在寻找的内容。此外,您可以将一个纹理 blit 到另一个而不需要两个帧缓冲区。我不确定 OpenGL ES 2.0 是否可以使用一个 fbo,但可以轻松修改以下代码以使用两个 fbo。您只需要将不同的纹理附加到不同的帧缓冲区附件。 glBlitFramebuffer 函数甚至可以管理抗锯齿应用程序的下采样/上采样!这是它的用法示例:
// bind fbo as read / draw fbo
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,m_fbo);
glBindFramebuffer(GL_READ_FRAMEBUFFER, m_fbo);
// bind source texture to color attachment
glBindTexture(GL_TEXTURE_2D,m_textureHandle0);
glFramebufferTexture2D(GL_TEXTURE_2D, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_textureHandle0, 0);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
// bind destination texture to another color attachment
glBindTexture(GL_TEXTURE_2D,m_textureHandle1);
glFramebufferTexture2D(GL_TEXTURE_2D, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, m_textureHandle1, 0);
glReadBuffer(GL_COLOR_ATTACHMENT1);
// specify source, destination drawing (sub)rectangles.
glBlitFramebuffer(from.left(),from.top(), from.width(), from.height(),
to.left(),to.top(), to.width(), to.height(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
// release state
glBindTexture(GL_TEXTURE_2D,0);
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,0);
关于opengl-es - 是否可以在 OpenGL 中将数据从一个帧缓冲区复制到另一个帧缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15306899/