У нас есть окно 3D-рендеринга, созданное с использованием GLFW, и мы хотим использовать QWebkit для отображения QWebPage внутри рендеринга (он же визуализирует QWebPage в текстуру OpenGL). Использование только версии ЦП слишком медленное, и Qt поддерживает рендеринг QWebkit в QOpenGLFramebufferObjects (используя QOpenGLPaintDevice).
Однако для этого необходимо создать QOpenGLContext (для которого требуется собственное окно и т. Д.), Что в конечном итоге повлияет на все наше приложение. (Переключение между GLFW и Qt Context также вызывает бесконечное количество GL_INVALID_OPERATIONs)
Лучшее решение: мы заставляем Qt использовать контекст GLFW.
Пример кода:
QOpenGLFramebufferObject qfbo(mWidth, mHeight); //< this crashes because he will implicitly try to get QOpenGLFunctions which gets the default context which is null
qfbo.bind();
QOpenGLPaintDevice paintdev(mWidth, mHeight);
QPainter painter(&paintdev);
painter.beginNativePainting();
mPage->mainFrame()->render( &painter );
painter.endNativePainting();
Итак, вот несколько вопросов:
@ Себастьян Кэбот написал:
Вы не можете напрямую смешивать два объекта контекста, используя QT. QT хорош, но для того, чтобы оставаться переносимым, он также имеет некоторые ограничения — в основном доступ к низкоуровневым дескрипторам объектов и непосредственное управление ими. Так что даже пытаясь использовать
QOpenGLContext
из другого потока, то тот, в котором он был создан, потерпит неудачу. И чтобы использовать любую из оболочек QT OpenGL, вам потребуется действующийQOpenGLContext
ток. Так что то, что вы хотите, невозможно без взлома реализации QT.
Других решений пока нет …