【发布时间】: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*)。我不确定有多少我不知道的陷阱(在性能、错误、上下文由于某种原因对表面无效等方面)。