来自GLFW上下文的QOpenGLContext

QOpenGLContext from GLFW Context

本文关键字:QOpenGLContext 上下文 GLFW 来自      更新时间:2023-10-16

我们有一个使用GLFW创建的3D渲染窗口,我们希望使用QWebkit在渲染中显示QWebPage(也就是将QWebPage渲染为OpenGL纹理)。仅使用CPU版本太慢,Qt支持将QWebkit渲染为QOpenGLFramebufferObjects(使用QOpenGLPaintDevice)。

然而,这样做需要创建一个QOpenGLContext(它需要自己的窗口等等),最终会干扰我们的整个应用程序。(在GLFW和Qt上下文之间切换也会导致无限量的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使用GLFW OpenGL上下文
  • 如果没有,我们如何在GLFW上下文和Qt上下文之间切换?(使用纹理共享来传输渲染的QWebPage)
  • 如果所有这些都是不可能的,是否有一个免费的Webkit项目,支持64位Windows/Linux/Mac,可以使用OpenGL进行渲染

@Sebastian Cabot写道:

不能使用QT直接混合这两个上下文对象。QT很好,但为了保持其可移植性,它也有一些局限性——主要是访问对象的低级别句柄并直接操作它们。因此,即使尝试使用来自不同线程的QOpenGLContext,也会失败。为了使用任何QT OpenGL包装器,您需要一个有效的QOpenGLContext电流。因此,如果不侵入QT实现,您想要的就不可能实现。