在 WebAssembly 构建中获取 Qt/QML 5.X 使用的上下文

问题描述

最近我一直在尝试使用 Qt 5.15.2(使用 -opengl es2 编译)Emscripten 构建一个 Qt/QML WebAssembly > 1.39.7 在 Windows 上使用 C++

这按预期工作。我正在使用一个简单的 QML applicationwindow显示 正好。从这一点上我假设如果 QML 能够绘制一些东西,那么一定有 与它相关联的上下文

我的下一步是获取 Qt 使用的上下文来绘制 QML 场景图。 然后我继续创建一个我自己的简单 QQuickItem 来测试它。

根据我从周围示例中收集到的信息,我设置了此项目 handleWindowChanged 信号以连接负责该项目的新窗口的 beforeSynchronizing

长话短说,我想我现在可以查询当前上下文的任何可用内容,我尝试的第一件事是获取当前的显示上下文surface 像这样:

  EGLdisplay display = eglGetCurrentdisplay();
  EGLContext context = eglGetCurrentContext();
  EGLSurface surface = eglGetCurrentSurface (EGL_DRAW);

但无济于事,它们都返回空指针。 我不太了解 Qt WebGL 的实现,所以在这一点上我想也许我必须通过其他方式查询

  1. QOpenGLContext

我偶然发现了 QOpenGLContext,我发现它可以从我的窗口(QQuickWindow)中检索,例如,在我的自定义项中:

QOpenGLContext* qtcontext = this->window()->openglContext();
qDebug() << "openGlModuleType : " << qtcontext->openGLModuleType();
qDebug() << "openGlModuleHandle : " << qtcontext->openGLModuleHandle();
qDebug() << "shared context openGlModuleHandle ? : " << qtcontext->shareContext()->openGLModuleHandle();

输出

openGlModuleType : 1
openGlModuleHandle : 0x0
shared context openGlModuleHandle ? : 0x0

由此我推测上下文的类型是 QOpenGLContext::LibGLES(OpenGL ES 2.0 或更高版本),但显然无论哪种方式(自己的或共享的)都无法检索句柄。 >

  1. QEGLNativeContext

然后,我尝试了 QEGLNativeContext 的另一个镜头,它可以通过使用 私有标头 ( QtPlatformHeaders/QEGLNativeContext ),却发现 nativeHandle 也返回了一个空值:

if(qtcontext->nativeHandle() == QVariant()) qDebug() << "null native handle";
QEGLNativeContext qteglcontext = qvariant_cast<QEGLNativeContext>(qtcontext->nativeHandle());
  1. Emscripten

我发现我也可以通过 Emscripten 查询 WebGL 当前上下文:

EMSCRIPTEN_WEBGL_CONTEXT_HANDLE emcontext = emscripten_webgl_get_current_context();

这似乎返回了一个非空值,但我发现无法从中检索上下文、显示或表面句柄。


我的目标是检索有效的 EGLdisplayEGLContextEGLSurface

我对 WebGL、OpenGL ES 不是很熟悉,所以我想我一定是在调用错误或者只是忽略了这里的要点。

有人可以分享他们在这件事上的经验吗?或者给我指明正确的方向?

那就太好了。

祝大家有个美好的一天。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)