将绑定到 FBO 的纹理复制到另一个 OpenGL 上下文

Posted

技术标签:

【中文标题】将绑定到 FBO 的纹理复制到另一个 OpenGL 上下文【英文标题】:Copy texture binded to FBO to another OpenGL context 【发布时间】:2015-04-07 08:59:51 【问题描述】:

我正在尝试将在一个上下文中创建的 FBO 中的纹理复制到另一个上下文。我正在使用 Qt 4.8.3 和 QGLFramebufferObject 类,OpenGL 2.1。 我使用 qt 类 QGLWidget 创建了两个带有小部件的上下文

我尝试使用 blitFramebuffer 方法将完整的 FBO 复制到另一个上下文,但没有成功。我如何从 FBO 复制纹理,或者也许还有另一种方法可以从 FBO 传输视觉内容。

FBO 是使用这些参数创建的

new QGLFramebufferObject(arraySize, arraySize, QGLFramebufferObject::NoAttachment, GL_TEXTURE_2D, GL_ALPHA);

【问题讨论】:

我是否理解正确,您正在尝试将数据从帧缓冲区复制到纹理?如果是,为什么blitFramebuffer 不起作用?有什么错误吗?另外,如何创建 OpenGL 上下文?您是否指定这两个上下文应该共享资源? 我忘了提到我使用 qt 类 QGLWidget 创建了两个上下文我正在尝试使用这种方法进行 blit:QGLFramebufferObject::blitFramebuffer(targetFBO_context2, rect, sourceFBO_context1, rect, GL_DEPTH_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) 而不是我绑定 targetFBO_context2 纹理并使用 glDrawArrays 我不知道共享资源在上下文之间,我会寻找这个主题谢谢 【参考方案1】:

我有两个解决这个问题的方法

    使用glGetTexImage复制附加到FBO的纹理 uint * pixels = new uint[FBO_WIDTH * FBO_HEIGHT]; glBindTexture(GL_TEXTURE_2D, someFBO->texture()); glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

    分享资源,正如 Mateusz Grzejek 所说: 在 qt 中,您必须将参数放入 QGLWidget 的构造函数 shareWidget,阅读更多 here QGLWidget 例如GLWidget(QWidget *parent = 0, QGLWidget * shareWidget = 0); 然后当你创建两个 GL 小部件时,使用这样的样式

GLWidget *glWidget = new GLWidget(this); GLWidget *glWidget2 = new GLWidget(this, glWidget);

【讨论】:

我觉得这个方法太慢了,在 CPU 和 GPU 之间复制数据。 blitFramebuffer 应该能够工作。至少我们成功地使用它来复制纹理。尝试调试参数的用法。

以上是关于将绑定到 FBO 的纹理复制到另一个 OpenGL 上下文的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL FBO 多个纹理

openGL FBO 复制到纹理导致黑色/深色图像

将opengl主帧缓冲区复制到fbo

OpenGL(FBO)中的普通后台缓冲区+渲染到深度纹理

OpenGL 渲染到 FBO

在 CUDA 中修改 OpenGL FBO 纹理附件