问题的简短形式:如何使用我的 FBO 作为纹理在我的 QGLWidget 中绘制,而不仅仅是获得一个空白的白色图像?
并且,一些背景和细节......我正在使用 Qt 5.1 作为在 GPU 上进行一些图像处理的应用程序。有一个“合成器”类,它使用一个 QOffscreenSurface、一个 QOpenGLContext 和一个 QOpenGLFramebufferObject。它向 FBO 渲染了一些东西。如果应用程序在仅渲染模式下运行,则结果将写入文件。以交互方式运行,它会显示在我的 QGLWidget 子类中,即“查看器”。</p>
如果我从 FBO 制作 QImage 并将其绘制给查看器,它就可以工作。但是,这需要从 GPU-> QImage-> 作为纹理返回到 GPU 的往返行程。理论上,我应该可以直接将FBO作为纹理使用,这正是我想要的。
我试图在我的 QOpenGLContext 和 QGLWidget 的 QGLContext 之间共享,如下所示:
查看器 = 新 tl::ui::glViewer(this); 合成器 = 新 tl::playback::glCompositor(1280, 720, this); 查看器->context()->contextHandle()->setShareContext(compositor->context);
是否可以在两种类型的上下文之间共享?这是这样做的方法吗?我需要做其他事情来使用合成器中的 FBO 在查看器中绘制吗?当我直接绘制 FBO 而不是 QImage 时,我只是变得纯白,所以我显然做错了什么。
所以我已经弄清楚了我的问题。我误解了 setShareContext() 的文档,该文档指出它“在调用 create() 之前不会生效”,我错误地认为这意味着您必须在创建上下文后共享上下文。相反,必须在之前建立共享:
viewer = new tl::ui::glViewer(this);
compositor = new tl::playback::glCompositor(512, 512, viewer->context()->contextHandle(), this);
以及我的 glCompositor 的新构造函数:
offscreenSurface = new QOffscreenSurface();
QSurfaceFormat format;
format.setMajorVersion(4);
format.setMinorVersion(0);
format.setProfile(QSurfaceFormat::CompatibilityProfile);
format.setSamples(0);
offscreenSurface->setFormat(format);
offscreenSurface->create();
context = new QOpenGLContext();
context->setShareContext(srcCtx);
context->setFormat(format);
context->create();
context->makeCurrent(offscreenSurface);
QOpenGLFramebufferObjectFormat f;
f.setSamples(0);
f.setInternalTextureFormat(GL_RGBA32F);
frameBuffer = new QOpenGLFramebufferObject(w, h, f);
将在与观众的上下文共享的新上下文中创建一个新的 FBO。画的时候,我只是绑定 glBindTexture(GL_TEXTURE_2D, frameBuffer->texture());
我正在标记我得到正确的答案,即使它没有直接解决我的问题。这是非常有用的。