3

質問の短い形式: 空白の白い画像を取得せずに、FBO をテクスチャとして使用して QGLWidget を描画するにはどうすればよいですか?

そして、いくつかの背景と詳細... GPU で画像処理を行うアプリに Qt 5.1 を使用しています。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); viewer->context()->contextHandle()->setShareContext(compositor->context);

2 つのタイプのコンテキスト間で共有することは可能ですか? これはそれを行う方法ですか?コンポジターで FBO を使用してビューアーに描画するには、他に何かする必要がありますか? QImageの代わりにFBOを直接描画すると真っ白になるので、明らかに何か間違っています。


だから私は自分の問題を理解しました。「create() が呼び出されるまで有効にならない」という setShareContext() のドキュメントを誤解していましたが、作成後にコンテキストを共有する必要があると誤って考えていました。代わりに、共有は次の直前に確立する必要があります。

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()); をバインドするだけです。

問題を直接解決することはできませんでしたが、正しい答えをマークしています。とても参考になりました。

4

1 に答える 1