OpenGL
- OpenGL (Open Graphics Library) 是一个跨语言、跨平台的应用程序编程接口 (API),用于渲染 2D 和 3D 矢量图形。
在 Khronos 了解更多信息。
OpenGL 的开发在 2017 年停止,取而代之的是 Vulkan,这是一种在较新硬件上提供更高性能的“次世代”API。
安装
要运行使用 OpenGL 的应用程序,您需要为您的硬件(GPU 或 CPU)安装正确的驱动程序。
- 对于 AMD (以及 ATI),除非有充分的理由使用私有驱动,否则建议使用开源驱动。
- 对于 NVIDIA,对于晚于 Kepler (NVE0/GKXXX) 系列的显卡,以及为了获得更好的整体性能,建议使用私有驱动。
- Intel 的 GenN 硬件指的不是 CPU 的代数,而是 GPU 的代数,这与 CPU 的代数不同。
- 要查找 AMD (以及 ATI) GPU 的系列,请查看 Wikipedia:List of AMD graphics processing units#Features overview
- 要查找 NVIDIA GPU 的代号,请查看 Nouveau 项目的代号列表
Mesa 是一个开源的 OpenGL 实现,不断更新以支持最新的 OpenGL 规范。它包含了一套用于 Intel 显卡、AMD (原 ATI) 和 NVIDIA GPU 的开源驱动。Mesa 还提供了软件光栅化器,例如 llvmpipe。
有两个 Mesa 软件包,每个软件包包含一组不同的驱动程序
- mesa 是最新的 Mesa 软件包,包含大多数适用于新硬件的现代驱动
r300: 用于 AMD Radeon R300, R400 和 R500 GPU。r600: 用于 AMD Radeon R600 GPU 直至 Northern Islands。由 AMD 官方支持。radeonsi: 用于 AMD Southern Island GPU 及之后型号。由 AMD 官方支持。nouveau: Nouveau 是 NVIDIA GPU 的开源驱动。virtio_gpu: 用于 virtio 的虚拟 GPU 驱动,可与基于 QEMU 的 VMM (如 KVM 或 Xen) 一起使用。vmwgfx: 用于 VMware 虚拟 GPU。i915: 用于 Intel Gen 3 硬件。crocus: 用于 Intel Gen 4 到 Gen 7 硬件。iris: 用于 Intel Gen 8 硬件及之后型号。由 Intel 官方支持。zink: 一个用于在 Vulkan 之上运行 OpenGL 的 Gallium 驱动。d3d12: 用于仅支持 D3D12 的设备(例如 WSL)上的 OpenGL 3.3 支持。softpipe: 一个软件光栅化器和参考 Gallium 驱动。llvmpipe: 一个使用 LLVM 进行 x86 JIT 代码生成且支持多线程的软件光栅化器。
- mesa-amber 是旧版 Mesa 软件包,包含适用于旧硬件的经典 (非 Gallium3D) 驱动
i830: 用于 Intel Gen 2 硬件。与i965二进制文件相同。i915: 用于 Intel Gen 3 硬件。与i965二进制文件相同。i965: 用于 Intel Gen 4 到 Gen 11 硬件。由 Intel 官方支持。radeon: 用于 AMD Radeon R100 GPU。与r200二进制文件相同。r200: 用于 AMD Radeon R200 GPU。nouveau_vieux: 用于 NVIDIA NV04 (Fahrenheit) 到 NV20 (Kelvin) GPU。swrast: 一个旧版软件光栅化器。
- 注意 使用 Mesa 时,应该会自动选择正确的驱动,因此安装软件包后无需进行配置。
- nvidia-utils 是 NVIDIA GPU 的私有驱动,其中包含一个 OpenGL 实现。
验证
要验证您的 OpenGL 安装,可以使用 mesa-utils 中的 eglinfo,它应该显示如下输出(当然,数值取决于您的配置)
$ eglinfo -B
Wayland platform: EGL API version: 1.5 EGL vendor string: Mesa Project EGL version string: 1.5 EGL client APIs: OpenGL OpenGL_ES OpenGL core profile vendor: Intel OpenGL core profile renderer: Mesa Intel(R) UHD Graphics (CML GT2) OpenGL core profile version: 4.6 (Core Profile) Mesa 25.1.3-arch1.3 OpenGL core profile shading language version: 4.60 OpenGL compatibility profile vendor: Intel OpenGL compatibility profile renderer: Mesa Intel(R) UHD Graphics (CML GT2) OpenGL compatibility profile version: 4.6 (Compatibility Profile) Mesa 25.1.3-arch1.3 OpenGL compatibility profile shading language version: 4.60 OpenGL ES profile vendor: Intel OpenGL ES profile renderer: Mesa Intel(R) UHD Graphics (CML GT2) OpenGL ES profile version: OpenGL ES 3.2 Mesa 25.1.3-arch1.3 OpenGL ES profile shading language version: OpenGL ES GLSL ES 3.20 X11 platform: EGL API version: 1.5 EGL vendor string: Mesa Project EGL version string: 1.5 EGL client APIs: OpenGL OpenGL_ES OpenGL core profile vendor: Intel OpenGL core profile renderer: Mesa Intel(R) UHD Graphics (CML GT2) OpenGL core profile version: 4.6 (Core Profile) Mesa 25.1.3-arch1.3 OpenGL core profile shading language version: 4.60 OpenGL compatibility profile vendor: Intel OpenGL compatibility profile renderer: Mesa Intel(R) UHD Graphics (CML GT2) OpenGL compatibility profile version: 4.6 (Compatibility Profile) Mesa 25.1.3-arch1.3 OpenGL compatibility profile shading language version: 4.60 OpenGL ES profile vendor: Intel OpenGL ES profile renderer: Mesa Intel(R) UHD Graphics (CML GT2) OpenGL ES profile version: OpenGL ES 3.2 Mesa 25.1.3-arch1.3 OpenGL ES profile shading language version: OpenGL ES GLSL ES 3.20
在 X11 平台上,glxinfo 同样有效。
在同一个软件包中,您还可以使用 eglgears_x11 或 glxgears (在 X11 上) 或 eglgears_wayland (在 Wayland 上) 作为基础的 OpenGL 测试。运行程序时,您应该能看到 3 个旋转的齿轮。
在驱动程序之间切换
Mesa
您可以使用以下 环境变量 来覆盖应用程序使用的驱动程序
MESA_LOADER_DRIVER_OVERRIDE=driver
默认情况下,Mesa 在 /lib/dri/ 中搜索驱动程序。您可以通过以下命令查看已安装的驱动程序列表
$ ls /lib/dri/
driver_dri.so 中的 driver 是驱动程序的实际名称。如果 Mesa 无法找到指定的驱动,它将回退到 llvmpipe。
您也可以通过设置以下 环境变量 来使用 OpenGL 软件光栅化器
LIBGL_ALWAYS_SOFTWARE=true GALLIUM_DRIVER=driver
driver 可以是 softpipe, llvmpipe 或 swr。
llvmpipe 和 swr 比 softpipe 更快。基于 Vulkan 的 OpenGL (Zink)
来自 Mesa 文档
- Zink 驱动是一个 Gallium 驱动,它发出 Vulkan API 调用,而不是针对特定的 GPU 架构。这可以用于在仅支持 Vulkan 的设备上获得完整的桌面 OpenGL 支持。
如果您在默认的 OpenGL 驱动中遇到问题(例如 RadeonSI、Iris 等中的 bug),可以尝试使用 Zink 驱动。
根据 这个 Phoronix 基准测试,在某些应用程序中,平均 FPS 可能会低于 RadeonSI。
请注意,Zink 在使用 AMD 或 Intel DDX 驱动 (xf86-video-amdgpu 和 xf86-video-intel) 的 X 系统上不再开箱即用。上游开发者建议使用通用的 modesetting(4) DDX 驱动。[1] 或者,为了绕过这个问题,您可以使用以下环境变量
$ LIBGL_KOPPER_DRI2=1 MESA_LOADER_DRIVER_OVERRIDE=zink
要在私有 NVIDIA 驱动上使用 Zink,请使用此命令或类似命令
$ env __GLX_VENDOR_LIBRARY_NAME=mesa __EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json MESA_LOADER_DRIVER_OVERRIDE=zink GALLIUM_DRIVER=zink LIBGL_KOPPER_DRI2=1 application
故障排除
联想 GPU 图形 Mesa 错误
Mesa 使用 CPU (llvmpipe) 进行渲染,导致某些 GUI 软件崩溃。通过进入 BIOS 设置并选择“动态显卡”而非“独立显卡”解决了此问题(如果使用其他电脑,请选择允许在 GPU 之间切换而非禁用集成 GPU 的选项)。如果在未安装主 GPU 驱动但期望集成显卡工作时,就会发生这种情况。[2]