我正在研究需要在多个窗口上进行OpenGL绘制的Qt 4应用程序。为此,我有一个Scene对象,该对象可以处理我的所有对象,并且可以在有界的opengl上下文中进行绘制,条件是该对象与在我所有视图/窗口之前创建的主上下文共享其显示列表。
我的问题是创建此“主要上下文”。目前,我发现的唯一解决方案是创建一个QGLWidget,将其添加到任何窗口中,并使用其gl上下文来初始化场景并创建其他上下文。
我想在创建任何小部件之前自行创建QGLContext。因为我的场景需要初始化缓冲区和其他GL东西。 我发现这种方法很丑陋,我想它是另一个选择,但我在互联网上找不到它。
我尝试过这个:
QGLPixelBuffer *oui = new QGLPixelBuffer(1, 1);
QGLContext *context = new QGLContext(QGLFormat::defaultFormat(), oui);
context->create();
context->makeCurrent();
_scene = new Scene(context);
但这会导致这种美丽的段错误:
Thread 1 "Visu" received signal SIGSEGV, Segmentation fault.
0x00c2dd55 in QX11Info::screen() const () from /usr/lib/libQtGui.so.4
(gdb) bt
#0 0x00c2dd55 in QX11Info::screen() const () from /usr/lib/libQtGui.so.4
#1 0x004d8a6f in QGLContext::tryVisual(QGLFormat const&, int) () from /usr/lib/libQtOpenGL.so.4
#2 0x004d5913 in QGLContext::chooseVisual() () from /usr/lib/libQtOpenGL.so.4
#3 0x004d94a4 in QGLContext::chooseContext(QGLContext const*) () from /usr/lib/libQtOpenGL.so.4
#4 0x0045cbb0 in QGLContext::create(QGLContext const*) () from /usr/lib/libQtOpenGL.so.4
#5 0x082452a4 in Visu::Initialiser (this=0x84c9150) at Src/Visu.cpp:73
#6 0x0826ac7f in main (argc=1, argv=0xbffff3b4) at Src/Main.cpp:99
我几乎可以肯定这是由于涂漆装置造成的。但是我找不到如何获得正确的绘画设备。
为了帮助您了解这是我现在正在做的事情:
View *view = View::createView(0, 0);
View *secondary = View::createView(0, view); // second parameter is the sharing widget
layout->addWidget(view, 0, 0); // without this it crash because the context is not valid
const_cast<QGLContext *>(view->context())->makeCurrent();
scene = new Scene(const_cast<QGLContext *>(view->context()));
view->setScene(scene);
secondary->setScene(scene);