Qt和OpenGL,为多个小部件使用一个上下文

时间:2012-11-08 20:10:55

标签: c++ qt opengl

我最近问了一个关于如何绕过多个上下文共享顶点数组对象和帧缓冲区对象问题的问题,然后我确信使用多个上下文只会引起更多令人头疼的问题。

我正在使用Qt,目前我的设置是我有一个不可见的QGLWidget,然后我在我可见的QGLWidget的构造函数中使用它以便共享资源,这很好地接受我不能分享某些东西背景。

我希望找到一个解决方案,我可以使用单个上下文来渲染我的所有不同的小部件,this question指的是使用QGLWidget构造函数传入您想要的QGLContext共享,但这似乎没有使用一个公共上下文,而是设置一个QGLWidget使用的上下文,当你尝试在第二个小部件上使用它时,调用一个qWarning通知你QGLContext必须引用你传递给它的小部件。

我的应用程序的目标是有2个单独的GUI,它们渲染不同的场景,但共享相同的上下文。目前我有一个世界'编辑一个场景并将其保存到我的游戏引擎中使用的文件的编辑器,我还有一个'材料'编辑器允许您以图形方式编辑与UDK的材质编辑器类似的材质,有一个使用OpenGL的预览窗口。

理想情况下,我希望保持目前的设计,即拥有一个可通过标签浏览的统一游戏编辑器,而不是为编辑器的每个部分分别设置程序。

唯一看起来像是一个不错的解决方案是使用QGraphicsView并将QGLWidget设置为视口,但这似乎根本不起作用。我可以渲染基本的原语,但不管怎样,它都会分崩离析。

有没有人有处理多个OpenGL Widgets问题的经验,如果是这样,你能解释一下你为实现目标所采取的过程吗?

1 个答案:

答案 0 :(得分:1)

我不太明白为什么你会遇到这么多麻烦,我正在建立一个类似CAD的应用程序,所以分享一些上下文,像这样:

  • 我使用应用程序范围的隐藏QGLWidget作为我的主窗口类的成员,这是加载了上下文着色器。
  • 对于每个文档窗口,窗口类都有一个隐藏的QGLWidget成员,这是加载的上下文几何。着色器上下文用作它的“共享”窗口小部件,允许文档访问应用程序广泛的着色器。
  • 每个文档窗口中的5个视口中的每一个都是可见的QGLWidget,这是实际渲染的位置。文档窗口几何QGLWidget用作“共享”窗口小部件,因此视口可以访问文档范围的几何数据和应用程序范围的着色器。

共享小部件参数允许您创建上下文的“继承”树,每个上下文都可以访问它自己的所有内容以及它的祖先数据(但不是它的子项或兄弟)。