在 Ubuntu 中安装 OpenGL

2025年3月17日 | 阅读 12 分钟

OpenGL (Open Graphics Library) 开放图形库。它是一个跨平台、跨语言的 API(应用程序编程接口),用于渲染 3D 和 2D 矢量图形。通常,该 API 用于与 GPU(图形处理单元)协同工作,以实现硬件加速渲染。

SGI(Silicon Graphics Inc.)于 1991 年开始开发 OpenGL,并于 1992 年 6 月 30 日发布;该 API 在视频游戏、飞行模拟、信息可视化、科学可视化、虚拟现实和 CAD(计算机辅助设计)等领域得到了广泛应用。自 2006 年以来,OpenGL 一直由一个非营利性技术联盟 **Khronos Group**(图形技术标准联盟)负责管理。

  • OpenGL 的规范定义了一个用于绘制 3D 和 2D 图形的抽象 API。
  • 然而,该 API 可以完全在软件中实现;它被设计为完全或主要在硬件中实现。
  • 该 API 被描述为一个函数集,客户端程序可以通过命名的整数常量集来识别它。
  • 然而,这些函数的定义与 C 编程语言的函数定义在表面上是相同的。
  • OpenGL 拥有多种语言绑定;其中一些最值得注意的是 JavaScript 绑定 WebGL,C 绑定 CGL、GLX 和 WGL;iOS 提供的 C 绑定;以及 Android 提供的 C 和 Java 绑定。

此外,OpenGL 除了语言独立性之外,还是跨平台的。该规范并未定义有关维护和获取 OpenGL 上下文的主题,而是将其留给底层窗口系统的细节。出于类似的原因,OpenGL 专注于渲染,不提供与窗口、音频或输入相关的 API。

OpenGL 的开发

OpenGL 并没有在积极的开发过程中。然而,在 2014 年至 2001 年之间,OpenGL 规范几乎每年都会更新一次,其中 2009 年发布了两个版本,2010 年发布了三个版本。最新的 OpenGL 规范 4.6 于 2017 年发布,并且仅限于在核心配置文件中添加了十一个现有的 EXT 和 ARB 扩展。

OpenGL 规范的新版本由 Khronos Group 发布,所有这些版本都扩展了 API 以支持许多新功能。所有版本的详细信息都由该组的成员(包括操作系统设计师、显卡制造商以及 **Google** 和 **Mozilla** 等通用技术公司)通过协商确定。

除了核心 API 所需的功能外,GPU 供应商还可以以扩展的形式提供额外的功能。扩展可以定义新的常量和函数,并且可以删除或放宽对 OpenGL 现有函数的限制。供应商可以利用扩展来公开自定义 API,而无需 Khronos Group 或其他供应商的整体支持,这极大地提高了 OpenGL 的灵活性。每个扩展都被收集在 OpenGL 注册表中并由其描述。

所有新版 OpenGL 引入的功能通常是由许多广泛实现的扩展的混合功能形成的,特别是 EXT 和 ARB 类型的扩展。

OpenGL 文档

OpenGL 的架构审查委员会发布了一系列手册,其中包含已更新以跟踪 API 更改的规范。通常,这些手册通过其封面颜色来引用:

Install OpenGL Ubuntu
  • 红宝书
    • 第 9 版,《OpenGL 编程指南》
    • 学习 OpenGL 的官方指南,支持 SPIR-V 的 4.5 版本。
  • 橙宝书
    • 第 3 版,《OpenGL 着色语言》
    • GLSL 的参考和教程书籍。
  • 绿宝书
    • 《X Window 系统 OpenGL 编程》
    • 一本关于 GLUT(OpenGL 工具包)和 X11 接口的书籍。
  • 蓝宝书
    • 第 4 版,《OpenGL 参考手册》 主要是一个 Unix 手册页的硬拷贝,用于 OpenGL。
    • 包含一个折叠的海报大小的图表,显示了一个理想化的 OpenGL 实现结构。
  • Alpha 宝书
    • 《Windows NT 和 95 OpenGL 编程》
    • 一本关于使用 Microsoft Windows 的 OpenGL 的书。
    • OpenGL 的文档也可以在其官方网页上找到。

OpenGL 的相关库

最早的 OpenGL 版本附带一个名为 GLU(OpenGL 工具包)的伴随库。它提供了有用且简单的功能,这些功能很少在新硬件上得到支持,例如镶嵌和生成基本形状以及 mipmap。GLU 规范最后一次更新是在 1998 年,并且依赖于 OpenGL 的功能,而这些功能现在已被弃用。

窗口和上下文工具包

鉴于创建 OpenGL 上下文是一项复杂任务,并且它在不同操作系统之间有所不同。自动创建 OpenGL 上下文已成为许多用户界面和游戏开发库(包括 Qt、FLTK、SFML、Allegro 和 SDL)的基本功能。

一些库专门用于创建支持 OpenGL 的窗口。第一个这样的库是 GLUT(OpenGL 工具包),后来被 freeglut 取代。一个新的替代方案是 GLFW。

  • 这些工具包旨在创建和管理 OpenGL 窗口以及处理输入,但仅限于此。
    • GLFW: 一个键盘-鼠标-操纵杆和跨平台窗口管理器;它面向游戏。
    • GLUT(OpenGL 工具包): 一个成熟的窗口管理器,目前不再维护。
    • freeglut: 一个键盘-鼠标和跨平台窗口管理器;其 API 是 GLUT API 的子集,并且比 GLUT 更现代、更稳定。
  • 许多 **“多媒体库”** 可以创建 OpenGL 窗口,并支持声音、输入和其他对游戏类软件有用的操作。
    • Allegro 5: 这是一个跨平台的 C API 多媒体库,专注于游戏开发。
    • SFML: 这是一个跨平台的 C++ API 多媒体库,并支持 Go、Haskell、Java 和 C# 等多种语言绑定。
    • SDL(Simple DirectMedia Layer): 这是一个跨平台的 C API 多媒体库。
  • 控件工具包
    • wxWidgets: 这是一个 C++ 的跨平台控件工具包。
    • Qt: 这是一个 C++ 的跨平台控件工具包。它提供了许多 OpenGL 辅助对象,可以抽象化 OpenGL ES 和桌面 GL 之间的区别。
    • FLTK: 这是一个小型的 C++ 跨平台控件库。

扩展加载库

一些库已被开发出来,可以自动加载所有可用的函数和扩展,因为识别和加载 OpenGL 扩展涉及大量工作。例如 glbinding、GLEW(OpenGL 扩展库)和 GLEE(OpenGL 简单扩展库)。此外,几乎所有的语言绑定,如 **PyOpenGL** 和 **JOGL**,都会自动加载扩展。

实现

Mesa 3D 是一个免费的 OpenGL 实现。它可以进行真正的软件渲染,并且可以通过利用直接渲染基础设施(Direct Rendering Infrastructure)在 Linux、BSD 和其他平台上利用硬件加速。截至 20.0 版本,它实现了 OpenGL 标准的 4.6 版本。

OpenGL 历史

在 1980 年代,开发能够与各种图形硬件兼容的应用程序是一项真正的挑战。应用程序开发者为所有硬件编写自定义驱动程序和接口。这既昂贵又费时。

到 1990 年代初,SGI(Silicon Graphics)在 3D 图形领域处于领先地位。与基于开放标准的 PHIGS 相比,其 IRIS GL API 的使用更为广泛。这是因为 IRIS GL 被认为易于使用,并且得到了即时模式渲染的支持。相比之下,PHIGS 被认为过时且功能难以使用。

  • SGI 的竞争对手(包括 IBM、惠普和 Sun Microsystems)也能够通过为 PHIGS 标准创建的扩展来推出 3D 硬件,这促使 SGI 将 IRIS GL 版本开源,成为一个名为 OpenGL 的公共标准。
  • 然而,SGI 有许多客户,他们从 IRIS GL 迁移到 OpenGL 需要大量的投资。
  • IRIS GL 还包含对 3D 图形不必要的功能。
  • 例如,它包含鼠标、键盘和窗口 API,因为它是与 **Sun's NeWS** 和 **X Window System** 集成之前的。
  • 由于专利和许可问题,IRIS GL 的库不适合公开。
  • 这些因素迫使 SGI 在成熟 OpenGL 的市场支持期间,继续支持专有的高级 Iris performer 和 Iris Inverter 编程 API。
  • 1992 年,SGI 主导成立了 OpenGL ARB(OpenGL 架构审查委员会),该委员会负责扩展和维护 OpenGL 规范。
  • 1994 年,SGI 曾计划发布一种称为 **“OpenGL++”** 的产品,其中添加了场景图 API(可能基于其性能技术)等元素。该规范在一些相关方之间发布。
  • 1996 年,微软发布了 Direct3D,它最终成为 OpenGL 的主要竞争对手。超过 50 家游戏开发商在一封公开信中署名,于 1997 年 6 月 12 日发布,积极呼吁微软支持 OpenGL。
  • 1997 年 12 月 17 日,SGI 和微软启动了 Fahrenheit 项目,这是一项旨在统一 Direct3D 和 OpenGL 接口的联合努力。1998 年,惠普也参与了该项目。
  • 最初,它在将交互式 3D 计算机图形 API 世界带入订单方面显示出了一些希望。然而,由于 SGI 的财务限制、微软的战略原因以及行业支持不足,该项目于 1999 年被放弃。
  • OpenGL 架构审查委员会已决定于 2006 年 7 月将 OpenGL API 标准的控制权移交给 Khronos Group。

OpenGL 版本历史

第一个 1.0 版 OpenGL 由 Kurt Akeley 和 Mark Segal 于 1992 年 6 月 30 日发布。此后,OpenGL 偶尔通过发布新的规范版本来开发。这些版本描述了每个符合要求的显卡应支持的基本功能集,并在此基础上更容易编写新的扩展。所有新的 OpenGL 版本倾向于与许多在显卡供应商中普遍支持的扩展进行交互。然而,这些扩展的细节可能会有所修改。

Install OpenGL Ubuntu

OpenGL 2.0

最初,OpenGL 2.0 版本由 3Dlabs 开发,旨在解决 OpenGL 所缺乏的方面并使其朝着一个有力的方向发展。3Dlabs 宣布了对该标准的几项重大补充。当时,其中大部分未被 ARB 接受,或未以 3Dlabs 宣布的方式实现。然而,他们关于 C 风格着色语言的声明最终得以完成,从而形成了 GLslang 或 GLSL(OpenGL 着色语言)的最新形式。

OpenGL 3.0 和 Longs Peak

在 OpenGL 3.0 发布之前,新版本代号为 Longs Peak。在其实际宣布时,Longs Peak 被描述为 OpenGL 历史上第一个重大 API 版本。它包含对 OpenGL 操作方式的重大改革,要求对 API 进行根本性修改。

OpenGL 3.0

OpenGL 3.0 版本定义了一种弃用方法,以简化后续的 API 版本。通过窗口系统声明一个前向兼容上下文,可以将标记为已弃用的功能完全禁用。然而,通过声明一个完整的上下文,仍可以通过这些已弃用的功能访问 OpenGL 3.0 的功能。
已弃用的功能如下:

  • OpenGL 着色语言的 1.10 和 1.20 版本
  • 索引颜色渲染目标
  • 显示列表
  • 使用 glEnd 和 glBegin 的直接模式渲染
  • 所有固定功能的片段和顶点处理

Open 3.1

OpenGL 3.1 版本完全删除了 3.0 版本中所有被弃用的功能,但保留了宽线例外。从这个版本开始,无法使用完整上下文使用新功能,也无法使用前向兼容上下文使用已弃用的功能。如果实现支持该扩展(即 ARB_compatibility),则对上述规则进行扩展,但这不能保证。

Open 3.2

OpenGL 3.2 版本通过将规范分为兼容配置文件和核心配置文件,进一步发展了 3.0 版本定义的弃用方法。兼容上下文包含固定功能和先前已移除的 API,与 3.1 版本 OpenGL 发布的 ARB_compatibility 扩展相同,而核心上下文则不包含。此外,OpenGL 3.2 版本包含对 GLSL 1.50 版本的升级。

OpenGL 3.3

Mesa 支持 softpipe、软件驱动 SWR 和使用 NV50 的旧 Nvidia 显卡。

OpenGL 4.0

OpenGL 4.0 版本与 3.3 版本一起发布。它为支持 Direc3D 11 的硬件而开发。与 OpenGL 3.0 版本一样,此 OpenGL 版本包含一些相对不重要的扩展,旨在充分披露 Direc3D 11 级硬件的功能。最受影响的扩展如下:

硬件支持: AMD Radeon HD 5000 系列及更新型号,Nvidia GeForce 400 系列及更新型号,Intel Ivy Bridge 处理器及更新型号的 Intel HD Graphics。

  • OpenGL 4.1
    • 硬件支持: AMD Radeon HD 5000 系列及更新型号,Nvidia GeForce 400 系列及更新型号,Intel Ivy Bridge 处理器及更新型号的 Intel HD Graphics。
  • OpenGL 4.2
    • 支持对纹理单层进行读-改-写加载-存储-原子和原子计数器操作的着色器。
    • 通过 GPU 顶点处理捕获的多个数据实例进行绘制,以高效地复制和重新定位复杂对象。
    • 支持更改压缩纹理的任意子集,而无需重新下载整个纹理,从而大大提高 GPU 性能。
    • 硬件支持: AMD Radeon HD 5000 系列及更新型号,Nvidia GeForce 400 系列及更新型号,Intel Ivy Bridge 处理器及更新型号的 Intel HD Graphics。
  • OpenGL 4.3
    • 计算着色器在图形管道上下文中利用 GPU 并行性。
    • 着色器存储缓冲区对象,允许着色器读写缓冲区对象,例如 4.2 版本中的图像存储/加载,但从语言而不是函数调用。
    • EAC/ETC2 纹理压缩作为一项基本功能。
    • 图像格式参数的查询。
    • 与 OpenGL ES 3.0 API 完全兼容。
    • 纹理视图,用于以不同的样式解释纹理,而无需数据复制。
    • 调试功能,可在应用程序开发期间获取调试消息。
    • 多应用程序鲁棒性和增强的内存安全性。
    • 硬件支持: Intel Haswell 处理器及更新型号的 Intel Graphics,AMD Radeon HD 5000 系列及更新型号,Nvidia GeForce 400 系列及更新型号。
  • OpenGL 4.4
    • 高效地同时绑定多个对象。
    • 着色器接口变量中的更多布局控制表达式。
    • 缓冲区对象内的异步查询。
    • 强制缓冲区对象的使用控制。
    • 硬件支持: Intel Broadwell 处理器及更新型号的 Intel HD Graphics,AMD Radeon HD 5000 系列及更新型号,Nvidia GeForce 400 系列及更新型号,Tegra K1。
  • OpenGL 4.5
    • OpenGL ES 3.1 API 和着色器兼容性: 用于方便地在桌面系统上开发和执行最新的 OpenGL ES 应用程序。
    • 鲁棒性: 为应用程序(如 WebGL 浏览器)提供安全环境,例如防止 GPU 重置影响任何其他活动应用程序。
    • 刷新控制: 应用程序可以在上下文切换之前管理待处理命令的刷新。它支持多线程高性能应用程序。
    • DSA(直接状态访问): 对象访问器允许在不绑定对象的情况下修改和查询状态,从而提高中间件的灵活性、效率和应用程序。
    • 硬件支持: Intel Broadwell 处理器及更新型号的 Intel HD Graphics,AMD Radeon HD 5000 系列及更新型号,Nvidia GeForce 400 系列及更新型号,Tegra X1 和 Tegra K1。
  • OpenGL 4.6
    • 改进的各向异性过滤。
    • SPIR-V 着色器。
    • 多边形偏移函数钳制可解决阴影渲染问题。
    • 通过无错误管理上下文实现高性能。
    • 从统计数据、计数器和溢出查询中获取更多信息。
    • 更充分的着色器执行。
    • 更充分的 GPU 端几何处理。
    • 驱动程序支持
      • NVIDIA GeForce 397.31 图形驱动程序仅支持 Windows 7、8、9、10*86-64 位,不支持 32 位。发布于 2018 年 4 月。
      • Intel 26.20.100.6861 图形驱动程序支持 Windows 10。发布于 2019 年 5 月。
      • AMD Adrenalin 18.4.1 图形驱动程序支持 Windows 7 SP1、1803 版 Windows 10,支持 AMD Radeon HD 7700+、HD 8500+ 及更新型号。发布于 2018 年 4 月。
      • Mesa 19.2 在 Linux 上支持 Intel Broadwell 及更新型号的 OpenGL 4.6。Mesa 的 20.0 版本支持 AMD Radeon GPU,而对 Nvidia Kepler+ 的支持正在进行中。此外,Zink 作为仿真驱动程序使用 21.1 版本,软件驱动 LLVMpipe 支持 Mesa 21.0。
    • 硬件支持: Intel Haswell 处理器及更新型号,AMD Radeon HD 7000 系列及更新型号,Nvidia GeForce 400 系列及更新型号。

OpenGL 的替代实现

Apple 在 macOS 10.14 Mojave 和 iOS 12 中弃用了 OpenGL,转而支持 Metal。然而,截至 macOS 13 Ventura(包括 Apple Silicon 设备),OpenGL 仍然存在。4.1 版本是自 2011 年以来 OpenGL 支持的最高版本。通过 MoltenVK,可以使用 MoltenGL 库将 OpenGL 调用转换为 Metal。

有许多项目尝试在 Vulkan 之上实现 OpenGL。Google 在 2020 年 7 月通过 ANGEL 的 Vulkan 后端实现了 OpenGL ES 3.1 的兼容性。此外,Mesa3D 项目包含一个名为 Zink 的驱动程序。

OpenGL 未来

Apple 于 2018 年 6 月在其所有平台(tvOS、macOS 和 iOS)上弃用了 OpenGL API,强烈鼓励开发者使用其于 2014 年宣布的 Metal API。只有 Google 的 Fuchsia 和 Stadia 支持 Vulkan。id Software 于 2016 年发布了 id Tech 6 游戏引擎的更新,支持 Vulkan,同时保留对 OpenGL 的支持。ID Tech 7 已移除 OpenGL 支持。

Valve 于 2021 年 9 月 17 日宣布将在未来的更新中从 **Dota 2** 中移除 OpenGL。在三星的支持下,Atypical Games 更新了游戏引擎,使其能够利用 Vulkan 而不是 OpenGL,几乎支持所有非 Apple 平台。与 Vulkan 相比,OpenGL 不支持光线追踪,而光线追踪是 GPU 中用于视频解码的 API。Mesa 着色器仅支持 nVidia。OpenGL 不支持使用深度学习的抗锯齿算法 - AMD FSR(FidelityFX Super Resolution)和 Nvidia DLSS。

在 Ubuntu 上安装 OpenGL

首先,我们将打开终端窗口,并使用以下命令更新包存储库。

现在,我们将在终端窗口中运行以下命令。


Install OpenGL Ubuntu
下一个主题Let's Encrypt Ubuntu