是否可以在 Qt 的***窗口之间使用相同的 OpenGL 上下文?

Posted

技术标签:

【中文标题】是否可以在 Qt 的***窗口之间使用相同的 OpenGL 上下文?【英文标题】:Is it possible to use the same OpenGL context between top-level windows in Qt? 【发布时间】:2015-04-24 03:44:53 【问题描述】:

我正在 Qt 中开发一个编辑器,它将在多个***窗口中同时运行多个 GL 上下文。由于 VAO 不能在上下文之间共享,我正在尝试想出一种方法来在每个上下文的基础上管理它们,这被证明是相当复杂的。

如果我可以简单地在两者之间使用相同的上下文,那会简单得多,但是这在 Qt 5.4 中似乎是不可能的。 QGLWidget 能够显式地将 QGLContext 指针作为构造函数参数,但 QOpenGLWidget 没有相应的函数。这就是the documentation 所说的上下文共享:

当多个 QOpenGLWidgets 作为子级添加到同一个***小部件时,它们的上下文将相互共享。这不适用于属于不同窗口的 QOpenGLWidget 实例。

有没有办法解决这个问题?

不幸的是,我找不到太多关于这个主题的信息,因为 QOpenGLWidget 相对较新 - 我能找到的大部分内容都是关于 QGLWidget。

编辑:我正在尝试一些不同的事情,并且在创建自定义 GL 小部件方面取得了一些成功,因此我可以自己管理上下文,尽管存在一些错误。然而,在某些情况下,听起来实际上需要为不同的窗口提供不同的上下文,这意味着我应该坚持使用 QOpenGLWidget 并提出一个 VAO 管理系统。如果对此主题有更多知识/经验的人可以解释这是如何工作的,那将是很酷的。

【问题讨论】:

也许你可以和QOpenGLContext::makeCurrent(QSurface)一起玩? 您也可以依赖一个上下文,一个画布,并使用视口自己进行屏幕分割。您甚至可以手动实现某种调整大小。这为您提供了很大的优化空间。 @otopolsky 嗯,很有趣...我将尝试使用 QWindow 设置我自己的 GL 小部件。这可能让我自己管理上下文。 试一试,它似乎有点工作,虽然有一些非常丑陋的错误。不过,我也许可以通过更多的工作来解决其中的大部分问题。不过,我对 OpenGL 和 Qt 的设置知之甚少,无法知道这是否真的是一个好主意,而不是仅仅在 QOpenGLWidgets 中调用 QOpenGLContext::SetCurrent(QSurface*)。我不确定有多少我不知道的陷阱(在性能、错误、上下文由于某种原因对表面无效等方面)。 【参考方案1】:

来自QOpenGLWidget documentation:

在属于的 QOpenGLWidget 实例之间设置共享 不同的窗口,设置 Qt::AA_ShareOpenGLContexts 应用程序 实例化 QApplication 之前的属性。这将触发共享 在所有 QOpenGLWidget 实例之间,无需任何进一步的步骤。

根据Application Attribute documentation,这个标志是在5.4版本中引入的

【讨论】:

我意识到这并不能解决问题中的问题,因为它实际上并没有共享上下文,但可以共享资源子集,不包括 VAO。 Qt 文档并未完全明确这一点。我应该删除这个答案,还是留在这里让其他人从我的误解中学习? 请离开。我遇到了完全相同的问题(VAO 不可共享),这确实非常令人困惑。知道它是已定义的行为(无论多么愚蠢),就可以排除用户错误和驱动程序错误。

以上是关于是否可以在 Qt 的***窗口之间使用相同的 OpenGL 上下文?的主要内容,如果未能解决你的问题,请参考以下文章

在多个 ui 文件之间拆分 Qt 表单

在活动的 OS X 桌面上保留一个窗口

QT C++ 编写多窗口之间的跳转 在一个窗口中可以变化很多UI界面

Qt的问题如何打开它们之间调用的2个窗口

qt窗口设置背景图片文件路径

使用 Qt 固定位置(与 css 效果相同)