将绑定到 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 上下文的主要内容,如果未能解决你的问题,请参考以下文章