如何在 Windows 10 (WSL) 下对 Ubuntu 上的 OpenGL 进行故障排除

Mr.*_*rub 5 opengl ubuntu windows-10 windows-subsystem-for-linux

我已经使用适用于 Linux 的 Windows 子系统 (WSL) 在 Windows 10 上安装了 Ubuntu。我正在尝试让 OpenGL 图形工作。我的最终目标是能够为需要 OpenGL 的 Robot OS (ROS) 运行 Gazebo 模拟器。作为第一步,我试图确保 OpenGL 图形按预期工作。

根据本教程和许多其他教程,要运行 ROS 和 Gazebo,我应该安装 VcXsrv 并在禁用“本机 OpenGL”选项的情况下运行 X 服务器,所以我正在这样做。

我的直接问题是 OpenGL 似乎工作不正常。我已经安装了 Mesa utils,当我运行时,glxgears我确实看到了图形窗口,但是动画非常慢。我估计齿轮的转动速度约为每分钟 1 转。我可以使用箭头键重新定向齿轮,但更新再次非常缓慢。(如果这很重要的话,时不时会有一个明显的“跳跃”。)

为了进行比较,我尝试glxgears在 VirtualBox 机器上运行的 Ubuntu 上运行。令我惊讶的是,它的动画速度要快得多;齿轮大约每 4 秒旋转一次,而在 Windows 下使用 WSL 运行时每一次(可能是 60 秒,但我失去了耐心)。这是一个很大的惊喜,因为我预计 VirtualBox 会慢得多。

在带有 WSL 的 Windows 上,glxgears声称它运行得非常快——在 800 到 1700 FPS 之间。在 VirtualBox 中glxgears报告大约 900-1000FPS。

glxgears 和 OpenGL 的版本信息:

xxxx@DESKTOP-8U2MCOG:~$ glxgears -info
GL_RENDERER   = Software Rasterizer
GL_VERSION    = 1.4 (2.1 Mesa 19.2.0-devel (git-cdf42f5eaa))
GL_VENDOR     = Mesa Project
GL_EXTENSIONS = GL_ARB_depth_texture GL_ARB_fragment_program GL_ARB_fragment_program_shadow GL_ARB_occlusion_query GL_ARB_texture_env_dot3 GL_ARB_transpose_matrix GL_EXT_draw_range_elements GL_EXT_multi_draw_arrays GL_NV_depth_clamp GL_NV_fog_distance GL_NV_point_sprite GL_SUN_multi_draw_arrays
VisualID 183, 0xb7
20311 frames in 5.0 seconds = 4062.197 FPS
Run Code Online (Sandbox Code Playgroud)

为什么glxgears在 WSL 中运行如此缓慢?如果它应该能够运行得更快,那么我该如何实现呢?

更新

根据下面@allquixotic 的回答,我再次尝试使用该wgl选项运行,我通过选中第二个复选框“Native opengl”来实现。我以前试过这个,但事实证明我需要在重新启动后这样做才能生效。当我glxgears使用此设置运行时,控制台上的读数略有不同:

xxxx@DESKTOP-8U2MCOG:~$ glxgears
Running synchronized to the vertical refresh.  The framerate should be
approximately the same as the monitor refresh rate.
23633 frames in 7.5 seconds = 3147.913 FPS
10395 frames in 6.8 seconds = 1529.523 FPS
10395 frames in 6.9 seconds = 1512.829 FPS
Run Code Online (Sandbox Code Playgroud)

现在我很确定我的显示器不会以 1500Hz 的垂直扫描速率运行!所以我认为这可能是真实情况的一个指标;间接渲染系统有些奇怪。我还注意到,当我按 CTRL+C 结束程序时,GL 窗口在我终止程序后继续运行和动画 10-11 秒——如果我只运行程序 3- 4 秒。所以我不得不猜测有大量的消息在排队,或者类似的东西......?

Mr.*_*rub 14

虽然我讨厌成为对自己的问题发表答案的“那个人”,但为了让事情顺利进行,我经历了不止一点点痛苦,我想为下一个人省去同样多的麻烦。所以,这里是

什么实际上结束了工作

出于我不明白的原因,当我违反@allquixotic 的(非常明智的)建议时,我的系统正常工作。

1) 禁用 LIBGL_ALWAYS_INDIRECT

这最终变得非常困难,仅仅因为我必须找到它的设置位置。

  • 文件夹中\etc\profile.d有一个文件wsl-integration.sh
  • 上面的文件实际上是一个符号链接;实际文件是/usr/share/wslu/wsl-integration.sh
  • 在那个文件LIBGL_ALWAYS_INDIRECT中设置了变量,所以我注释掉了那行。

2) 不要-wgl对 VcXsrv使用命令行参数(或它的 GUI 等效参数)

由于我是从 GUI 客户端启动 VcXsrv,这意味着不选中第二个选项框,标题为“Native opengl”。

只有在我进行了这两项更改(并重新启动以确保 VcXsrv 的旧设置没有保留)之后,齿轮才会glxgears以正常速度转动,我可以使用箭头键重新调整它们的方向,就像它们一样“重新应该工作。

  • 如果你运行 `glxinfo`,它很可能会告诉你你的图形设备是 llvmpipe (https://www.mesa3d.org/llvmpipe.html)。Llvmpipe 是一个软件渲染器,因此 OpenGL 现在可以使用您的 CPU 在 linux 上渲染。 (2认同)

all*_*tic 7

实际上试图解决你的问题

  1. 在运行需要硬件加速的 Robot OS 程序(例如 glxgears)之前,请运行export LIBGL_ALWAYS_INDIRECT=1.
  2. 启动 VcXsrv(或 Windows 上的任何 X 服务器)时,将-wgl命令行参数作为命令行参数传递到服务器。
  3. 如果这不起作用,请尝试使用付费版本的 Xming 而不是 VcXsrv。
  4. 如果这仍然不起作用,那你就很不走运了。请阅读以下内容以了解原因。

引擎盖下的解释

在适用于 Linux 的 Windows 子系统 (WSL) 或 Hyper-V 来宾中,硬件加速的 OpenGL 只能通过间接渲染来实现

GLX 是 X11 客户端-服务器协议的协议扩展。X11 客户端-服务器协议是用于客户端(创建 X 窗口的程序)和服务器(将这些窗口呈现在物理或虚拟屏幕上的程序)之间通信的网络协议。

桌面Linux 上,GLX 是访问 OpenGL 的标准机制。从客户端程序来看,它基本上是一个两步过程:(1) 与 GLX 对话,然后 (2) 与 OpenGL 对话。第二步取决于您使用的是间接渲染还是直接渲染(即,间接或直接 GLX)。

  • 间接渲染:

    • 最高仅支持 OpenGL 1.4 版(无 GLSL 等)
    • LIBGL_ALWAYS_INDIRECT=1大多数程序需要环境变量才能使用它,否则它们默认为直接渲染。
    • 使用 GLX协议将所有 OpenGL 命令发送到 X 服务器。
    • X 服务器后端使用 X 服务器本地的 OpenGL 实现来完成对窗口的渲染。
    • 是网络透明的,这意味着它可以通过网络连接和 UNIX 域套接字以及本地工作。
  • 直接渲染:

    • 支持图形驱动程序支持的任何 OpenGL 版本,如果 OpenGL 发布新版本,则最高可达 OpenGL 4.x 或更高版本。
    • 需要环境变量LIBGL_ALWAYS_INDIRECT未设置
    • 使用动态加载将所有 OpenGL 命令发送到可用符号libGL.so(最后是适当的版本,如 libGL.so.1 等)——这些是本机函数调用。
    • X 服务器不会直接“看到”OpenGL 渲染命令。它所看到的只是一个矩形区域,它在帧缓冲区中留出供图形驱动程序渲染。它不知道渲染了什么,只知道在哪里
    • 不是网络透明的,这意味着它只能在同一台计算机上本地运行。

的OpenGL的实现,支持GLX直接渲染,但是-不知道的是X服务器-管道OpenGL调用在网络上硬件加速远程。这个产品叫做VirtualGL。但是 VirtualGL 没有 Windows 服务器组件,因此无法在 Windows 主机上使用 VirtualGL。如果您在虚拟化中运行 Linux 主机和 Linux 客户机,您可以使用从客户机到主机的 VirtualGL,以使用主机的显卡在客户机中直接渲染。

我不知道“Robot OS”是什么,但如果它只需要 1.4 或更早版本的 OpenGL 命令,那么如果您使用该-wgl命令在 Windows 主机上运行 X 服务器,它应该可以工作。X 服务器需要支持这个标志。我自己从来没有让它与 VcXsrv 一起工作,但我知道 Xming 的付费版本可以工作。

有几个 X 服务器在 Windows 上运行。除了非常昂贵的商业实现之外,我已经测试了其中的大部分。在我看来,最适合 OpenGL 的是 Xming 的付费版本。免费版本已经过时了,也没有那么好。

但是,不存在——不可能存在——在间接渲染模式下(来自 WSL 或 Hyper-V 客户端)支持 OpenGL 1.4 以上的 Windows X 服务器的实现,因为 GLX协议本身没有指定 OpenGL 调用1.4 以上版本。

因此,如果 Robot OS 需要 OpenGL 1.4 以上的版本,则无法在 WSL 或 Hyper-V 中运行它并在 Windows X 服务器上获得硬件加速渲染。你必须使用像 VMware Workstation 这样的东西。