是否可以在 OpenGL 中将数据从一个帧缓冲区复制到另一个帧缓冲区?

Med*_*eda 5 opengl-es opengl-es-2.0

我想这在某种程度上是可能的,因为:

glBindFramebuffer(GL_READ_FRAMEBUFFER_APPLE, _multisampleFramebuffer);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_APPLE, _framebuffer);
glResolveMultisampleFramebufferAPPLE();
Run Code Online (Sandbox Code Playgroud)

正是这样做的,并在顶部解决了多重采样问题。然而,这是一个苹果扩展,我想知道是否有类似的东西可以将所有逻辑缓冲区从一个帧缓冲区复制到另一个帧缓冲区,并且不在普通实现中执行多重采样部分。GL_READ_FRAMEBUFFER似乎不是一个有效的目标,所以我猜没有直接的方法吗?解决方法怎么样?

编辑:似乎可以glCopyImageSubData在 OpenGL 4 中使用,不幸的是在我的情况下不行,因为我在 iPhone 上使用 OpenGL ES 2.0,它似乎缺乏该功能。还有其他办法吗?

Sir*_*sar 4

glBlitFramebuffer 可以完成您正在寻找的任务。此外,您可以将一个纹理传输到另一个纹理上,而不需要两个帧缓冲区。我不确定 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);
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢您提供的代码示例的简单性,但我想指出一些拼写错误只是为了澄清:(1) `glFramebufferTexture2D` 应该将 `GL_FRAMEBUFFER` 作为其第一个参数;(2) 你切换了`glReadBuffer`和`glDrawBuffer`;(3) 您可以通过使用“GL_FRAMEBUFFER”作为参数来组合两个“glBindFrameBuffer”命令,因为在这种情况下“GL_FRAMEBUFFER”意味着绑定到两个命令。感谢您的帖子! (4认同)
  • glBlitFramebuffer 在 OpenGL ES 2.0 中不可用 (2认同)