微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 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 举报,一经查实,本站将立刻删除。