【问题标题】:How to ANGLE in Qt 6 OpenGL如何在 Qt 6 OpenGL 中调整角度
【发布时间】:2022-10-24 18:23:09
【问题描述】:

Qt 6 has removed the support 用于 ANGLE 用于他们的 OpenGL 后端。现在我仍然想在 Qt 中使用 ANGLE,因为我想在 Windows 上运行由 ANGLE 转换为 Vulkan Linux 和 Direct3D 的自定义 OpenGL 代码。我尝试在我的 Qt 6 应用程序中使用 ANGLE,但没有成功。我尝试过的是:

根据说明(ANGLE build instructions).

将生成的 libGLESv2.so 和 libEGL.so 文件复制到应用程序目录中。然后在我的 CMakeFiles.txt 我添加了:

find_library(libGLESv2 GLESv2)
find_library(libEGL EGL)
target_link_libraries(MyApp PRIVATE ${libGLESv2} ${libEGL})

然后在我的主文件中我添加了

QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);
QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGL);

我的项目链接并构建良好,但 ANGLE 后端似乎没有效果。看来 Qt 仍在使用标准的 OpenGL 实现,而不是 ANGLE 提供的实现(运行 QOpenGLContext::currentContext()->hasExtension("EGL_ANGLE_platform_angle") 在我设置上下文时返回 false)。

使用 QT_LOGGING_RULES=qt.qpa.gl=true,日志显示:

qt.qpa.gl:根据以下优先级选择 xcb gl-integration ("xcb_glx", "xcb_egl") qt.qpa.gl: Xcb GLX gl-integration 创建 qt.qpa.gl: Xcb GLX gl-integration 成功初始化 qt.qpa.gl: FBConfig/Visual 选择前请求的格式: QSurfaceFormat(版本 3.0,选项 QFlagsQSurfaceFormat::FormatOption(), depthBufferSize 24, redBufferSize 8,greenBufferSize 8,blueBufferSize 8,alphaBufferSize -1, stencilBufferSize 8, 样本 -1, swapBehavior QSurfaceFormat::DoubleBuffer, swapInterval 1, colorSpace QSurfaceFormat::DefaultColorSpace,配置文件 QSurfaceFormat::NoProfile)

如何正确设置 Qt 以依赖 ANGLE?

【问题讨论】:

  • 请发布一个指向在 Linux 下显示此问题的可构建项目的链接,最好是 Ubuntu 20.04 或 Debian 11。它与 Qt 6 无关,但您可能想查看 WaylandGUI CMakeLists.txt。 github.com/RolandHughes/waylandgui 在尝试强制 GLES 链接时,我遇到了类似的问题。启动 X11 的太多东西都在寻找他们能找到的最古老的 X11 支持。另请检查:doc.qt.io/qt-6/embedded-linux.html
  • @user3450148 可以使用 Qt 中的任何 opengl 应用程序重现该行为(您可以在链接角度库后尝试此示例 pastebin.pl/view/94d5fee4,正如我在使用 CMake 的问题中建议的那样)。

标签: c++ qt opengl-es qt6


【解决方案1】:

好的,

当我要求一个可重现问题的可构建项目时,我并不是说没有导致问题的 CMakeLists.txt 的源代码 sn-p。我花了 4 个小时试图盲目地复制你的环境。没有人使用 Qt 6,因为它太可怕了。

第一个问题是你不能“只复制”库。 GLES 库

EGL 库

复制后

构建和运行时系统需要它的一系列链接。当您复制时,您会失去它,因为您会获得同一个文件的多个副本,而不是一个带有一堆链接的副本。如果您要使用这些库,您需要从安装位置或原始构建位置使用它们.

我想向你证明这个解决方案,而不仅仅是告诉你,但我遇到了same problem 98.5% of all developers run into when anything Android is installed near Qt

我想让你看看the CMakeLists.txt file for WaylandGUI,不是因为它是一个精彩的例子,而是让你看到如何使用 message() 来转储你的 cmake 变量。这是解决 cmake 问题时的“默认调试器”。

您没有正确使用 find_library()

https://cmake.org/cmake/help/latest/command/find_library.html

如果您安装了您构建的 ANGLE 库,那么 find_library 有 50/50 的机会找到它。需要转储 cmake 变量以查看它的外观和发现的内容,并且需要 message()。

特别是阅读 CMAKE_PREFIX_PATH 和 find_library() 的 PATHS 选项。如果文档看起来很清楚,您可以在 CMAKE_PREFIX_PATH 上查看此 SO 讨论。

cmake - find_library - custom library location

您需要知道的另一个命令是 ldd。真令人震惊,有多少人在 Linux 上开发却不知道这个命令。

ldd 所做的,从较高的概念层面上来说,是告诉您加载器在运行可执行文件时将使用的每个库,至少从初始加载的角度来看是这样。可执行文件本身可能能够在运行时强制加载其他库。当一个可执行文件在它启动之前死掉时,您可以使用 ldd 来追踪找不到哪个库(或库使用的库)。

在您的特定情况下,ldd 会告诉您链接期间使用了哪些 GLES 和 EGL 库。默认情况下 find_library() 首先查找“通常的地方”,这不是您的本地构建目录。您遇到的问题是您试图替换链接中的现有系统库。这是a very detailed write-up,介绍如何通过 find_library() 使用 HINTS 等。

无法复制您的构建环境并且没有完全的复制问题的可构建示例我无法提供进一步的帮助。

【讨论】:

    【解决方案2】:

    您是否成功地将 qt 6.x 与角度一起使用? 我也在尝试做这样的事情。 抱歉,我将其发布为答案-我需要一些“声誉”来发布正常的 cmets ...大声笑

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-23
      • 2019-07-02
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      相关资源
      最近更新 更多