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

标签 opengl-es opengl-es-2.0

我想这是有可能的,因为:

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/

相关文章:

java - Opengl 变换反馈在 Android 上正确制作

opengl-es - 在 glFramebufferTexture2D() 之后 glReadPixels() 的结果

java - Android OpenGL ES 2.0 - 在 onDestroy() 中使用 glDelete*

android - OpenGL ES 2.0 1 仅使用最后绑定(bind)纹理

android - 如何在几乎没有可见 FPS 下降的情况下加载 OpenGL ES 纹理?

c++ - OpenGL ES 是否适合执行骨骼动画?

ios - 如何在 OpenGL es 2.0 中模拟累积缓冲区(尾随粒子效应)

android - Opengl es 2.0 自定义着色器低 fps (android)

java - 将 GLSurfaceView 类与 android xml 布局一起使用

ios - opengles 中的 glReadPixels() 内存泄漏?