OpenGL

出自 ArchWiki

出自 Wikipedia:OpenGL

OpenGL (开放图形库) 是一种跨语言、跨平台的应用程序编程接口 (API),用于渲染 2D 和 3D 矢量图形。

Khronos 了解更多。

OpenGL 的开发于 2017 年停止,转而支持 Vulkan,这是一种“下一代”API,可在较新的硬件上提供更高的性能。

安装

要运行使用 OpenGL 的应用程序,您需要为您的硬件(GPU 或 CPU)安装正确的驱动程序。

提示
  • 对于 AMD(和 ATI),建议使用开源驱动程序,除非您有充分的理由使用专有驱动程序。
  • 对于 NVIDIA,建议使用专有驱动程序,尤其是对于 Kepler (NVE0/GKXXX) 系列之后的新显卡,并且通常可以获得更好的性能。
注意

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(如 KVMXen)一起使用。
    • vmwgfx :适用于 VMware 虚拟 GPU。
    • i915 :适用于 Intel 的 Gen 3 硬件。
    • crocus :适用于 Intel 的 Gen 4 到 Gen 7 硬件。
    • iris :适用于 Intel 的 Gen 8 硬件及更高版本。Intel 官方支持。
    • zink :一种 Gallium 驱动程序,用于在 Vulkan 之上运行 OpenGL。
    • d3d12 :在仅支持 D3D12 的设备(即 WSL)上支持 OpenGL 3.3。
    • swrast :一种传统的软件光栅化器。此驱动程序已在 Mesa 22.0.0[1] 中停止使用,但仍可在源代码中找到(ArchLinux 在 24.1.1[2] 中仍然包含它们)
    • 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 时,应自动选择正确的驱动程序,因此一旦安装软件包,就不需要进行任何配置。

验证

要验证您的 OpenGL 安装,您可以使用 mesa-utils eglinfo,它应显示如下输出(当然,具体值取决于您的设置)

$ eglinfo -B
Wayland platform:
EGL API version: 1.4
EGL vendor string: Mesa Project
EGL version string: 1.4
EGL client APIs: OpenGL OpenGL_ES
OpenGL compatibility profile vendor: Mesa Project
OpenGL compatibility profile renderer: i915 (chipset: Pineview M)
OpenGL compatibility profile version: 2.1 Mesa 23.1.5
OpenGL compatibility profile shading language version: 1.20
OpenGL ES profile vendor: Mesa Project
OpenGL ES profile renderer: i915 (chipset: Pineview M)
OpenGL ES profile version: OpenGL ES 2.0 Mesa 23.1.5
OpenGL ES profile shading language version: OpenGL ES GLSL ES 1.0.16

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: Mesa
OpenGL core profile renderer: llvmpipe (LLVM 15.0.7, 128 bits)
OpenGL core profile version: 4.5 (Core Profile) Mesa 23.1.5
OpenGL core profile shading language version: 4.50
OpenGL compatibility profile vendor: Mesa
OpenGL compatibility profile renderer: llvmpipe (LLVM 15.0.7, 128 bits)
OpenGL compatibility profile version: 4.5 (Compatibility Profile) Mesa 23.1.5
OpenGL compatibility profile shading language version: 4.50
OpenGL ES profile vendor: Mesa
OpenGL ES profile renderer: llvmpipe (LLVM 15.0.7, 128 bits)
OpenGL ES profile version: OpenGL ES 3.2 Mesa 23.1.5
OpenGL ES profile shading language version: OpenGL ES GLSL ES 3.20

在 X11 平台上,glxinfo 也有效。

从同一个软件包中,您还可以使用 eglgears_x11glxgears(在 X11 上)或 eglgears_wayland(在 Wayland 上)作为基本的 OpenGL 测试。您应该在运行该程序时看到 3 个旋转的齿轮。

驱动程序切换

对于混合显卡,请参阅 PRIME

注意: 根据这篇 Reddit 帖子,您可以使用来自不同供应商的 2 个 GPU,使用 PRIME 同时工作,而不会出现任何问题。

Mesa

您可以使用以下环境变量覆盖应用程序使用的驱动程序

MESA_LOADER_DRIVER_OVERRIDE=driver

默认情况下,Mesa 在 /lib/dri/ 中搜索驱动程序。您可以使用以下命令查看已安装驱动程序的列表

$ ls /lib/dri/

driverdriver_dri.so 中是驱动程序的实际名称。如果 Mesa 未能找到指定的驱动程序,它将回退到 llvmpipe

您还可以通过设置以下环境变量来使用 OpenGL 软件光栅化器

LIBGL_ALWAYS_SOFTWARE=true
GALLIUM_DRIVER=driver

driver 可以是 softpipellvmpipeswr

提示: 在大多数用例中,llvmpipeswrsoftpipe 更快。

基于 Vulkan 的 OpenGL (Zink)

来自 Mesa 文档

Zink 驱动程序是一种 Gallium 驱动程序,它发出 Vulkan API 调用,而不是针对特定的 GPU 架构。这可以用于在仅支持 Vulkan 的设备上获得完整的桌面 OpenGL 支持。

如果您在默认的 OpenGL 驱动程序中遇到问题(RadeonSI、Iris 等中的错误),您可以尝试使用 Zink 驱动程序。

根据 这份 Phoronix 基准测试,在某些应用程序中,平均 FPS 可能低于 RadeonSI。

要在 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 application

开发

注意: 本节适用于想要在项目中使用 OpenGL 的开发人员。最终用户不需要本节中的任何内容。

在代码中使用 OpenGL 需要函数加载器,请在 Khronos 了解更多信息。

本文或章节需要扩充。

原因: 列出与 OpenGL 相关的软件包以及 Arch 仓库中的软件包(在 Talk:OpenGL 中讨论)

OpenGL 硬件数据库

GPUInfo 提供用户报告的 GPU/驱动程序组合、支持的扩展、功能等。此信息对于验证特定硬件在 OpenGL 和 Vulkan 下的兼容性/合规性非常有用。