在Ubuntu中安装OpenGL
OpenGL是开放图形库的缩写。它是一个跨平台和跨语言的API(应用编程接口),用于渲染3D和2D矢量图形。通常,该API用于与GPU(图形处理单元)合作,以获得硬件加速的渲染。
SGI(Silicon Graphics Inc.)于1991年开始开发OpenGL,并于1992年6月30日发布;应用范围广泛,包括视频游戏、飞行模拟、信息可视化、科学可视化、虚拟现实和CAD(计算机辅助设计)等领域。自2006年以来,OpenGL一直由一个非营利性技术联盟Khronos Group负责。
- OpenGL的规范定义了一个抽象的API来绘制3D和2D图形。
- 然而,对于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年发布的,仅限于在核心配置文件中增加了11个现有的EXT和ARB扩展。
新版本的OpenGL规范由Khronos集团发布,所有这些规范都扩展了API,以支持几个新的方面。所有版本的细节都是由该小组的成员一致决定的,包括操作系统设计者、显卡制造商以及像Google和Mozilla这样的通用技术公司。
除了核心API所需要的方面之外,GPU供应商还可以以扩展形式提供额外的功能。扩展可以定义新的常量和函数,并可以删除或放宽对OpenGL现有功能的限制。供应商可以利用扩展来披露定制的API,而不需要Khronos集团或其他供应商的整体支持,这就高度提高了OpenGL的灵活性。每个扩展都被收集在OpenGL注册中心,并由该中心进行描述。
所有新版OpenGL引入的方面一般都是由许多广泛实现的扩展,特别是EXT和ARB类型的扩展的混合方面形成的。
OpenGL文档
OpenGL的架构审查委员会出版了一系列手册和规范,这些手册已被升级以跟踪API的修改。通常情况下,这些都是通过其封面颜色来提及的。
- 红皮书
- 第9版,OpenGL编程指南
- 学习OpenGL的官方指南,带有SPIR-V的4.5版本。
- 橙皮书
- 第三版,OpenGL着色语言
- 一本关于GLSL的参考和教程书。
- 绿皮书
- 对于X窗口系统,OpenGL编程
- 一本关于GLUT(OpenGL Utility Toolkit)和X11接口的书。
- 蓝皮书
- 第四版,OpenGL参考手册 主要是OpenGL的Unix手册页的硬拷贝
- 包含一个折叠式海报大小的图表,显示了理想化的OpenGL实现结构
- 阿尔法书
- 对于Windows NT和95,OpenGL编程
- 一本关于使用微软Windows的OpenGL的书
- OpenGL的文档也可以从其官方网页上获取。
OpenGL的相关库
最早的OpenGL版本是和一个被称为GLU(OpenGL实用程序库)的配套库一起发布的。它提供了有用的和简单的方面,而这些方面在新的硬件中很少被支持,如镶嵌和生成原始形状和mipmaps。GLU规范最后一次升级是在1998年,它依赖于OpenGL的功能,这些功能现在已经被废弃了。
窗口和上下文工具箱。
鉴于制作OpenGL上下文是一项复杂的任务,并且考虑到不同的操作系统之间存在差异。创建自动OpenGL上下文已经成为许多用户界面和游戏开发库的一个基本方面,包括Qt、FLTK、SFML、Allegro和SDL。
有些库是专门为生成一个支持OpenGL的窗口而设计的。最初的这种库是GLUT(OpenGL Utility Toolkit),后来被freeglut淘汰了。一个新的选择是GLFW。
- 这些工具包的开发是为了创建和处理OpenGL窗口和处理输入,但除此之外。
- GLFW: 一个键盘-鼠标-手杖和跨平台的窗口处理程序;它是面向游戏的。
- GLUT(OpenGL Utility Toolkit)。一个成熟的窗口处理程序,现在没有维护。
- freeglut。一个键盘鼠标和跨平台的窗口处理程序;它的API是GLUT API子集,它比GLUT更及时和稳定。
- 许多”多媒体库”可以使OpenGL Windows包含声音、输入和其他有助于游戏类软件的操作。
- Allegro 5:它是一个跨平台的多媒体库,同时还有一个专注于游戏开发的C API。
- SFML:它是一个跨平台的多媒体库,同时还有一个C++ API和其他几种语言的绑定,如Go、Haskell、Java和C#。
- SDL(简单直接媒体层)。它是一个跨平台的多媒体库,同时还有一个C语言的API。
- 小工具工具包
- wxWidgets。它是一个跨平台的C++ widget工具箱。
- Qt。它是一个跨平台的C++ widget工具箱。它提供了几个OpenGL辅助对象,可以抽象出OpenGL ES和桌面GL之间的区别。
- FLTK:它是一个小型跨平台的C++小部件库。
扩展的加载库
考虑到识别和加载OpenGL扩展所涉及的巨大工作量,已经开发了一些责任,自动加载每个可用的函数和扩展。这方面的例子包括glbinding、GLEW(OpenGL Extension Wrangler Library)和GLEE(OpenGL Easy Extension Library)。另外,几乎所有的语言绑定都会自动加载扩展,比如PyOpenGL和JOGL。
实现情况
Mesa 3D是一个免费的OpenGL实现。它可以做真实的软件渲染,也可能在Linux、BSD和其他平台上利用硬件加速,获得直接渲染基础设施的好处。它实现了4.6版本的OpenGL标准,截至20.0版本。
OpenGL的历史
在20世纪80年代,开发能够与大量不同的图形硬件一起工作的应用程序是一个实际的挑战。应用程序开发人员为所有的硬件部件编写了定制的驱动程序和接口。这是很昂贵的,而且出现了精力倍增的情况。
1990年代初,SGI(硅谷图形公司)在工作站的3D图形方面处于领先地位。他们的IRIS GL API比基于开放标准的PHIGS使用得更广泛。 这是因为IRIS GL被认为使用方便,而且它有即时模式渲染的支持。相比之下,PHIGS被认为在功能上已经过时,难以使用。
- SGI的竞争对手(包括IBM、惠普和Sun Microsystems)也有能力将由PHIGS标准创建的扩展支持的3D硬件推向市场,这推动了SGI将IRIS GL版本作为公共标准开源,称为OpenGL。
- 虽然,SGI有几个客户,对他们来说,从IRIS GL修改为OpenGL需要大量投资。
- IRIS GL也有对3D图形不重要的API功能。
- 例如,它包括一个鼠标、键盘和视窗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集团。
OpenGL的版本历史
第一个1.0版本的OpenGL于1992年6月30日由Kurt Akeley和Mark Segal发布。从那时起,OpenGL偶尔也会通过发布新的规范版本来进行开发。这些版本描述了每个符合要求的图形卡都应该支持的基准功能集,与之相对应的是,新的扩展可以更容易地编写。所有新的OpenGL版本都倾向于与许多扩展进行交互,这些扩展在显卡供应商中得到全面支持。然而,这些扩展的细节可能会被修改。
OpenGL 2.0
最初,2.0版本的OpenGL被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
3.0版本的OpenGL定义了一个弃用方法,以简化API的进一步修订。某些被强调为废弃的功能可以通过窗口系统要求一个向前兼容的上下文而被完全禁用。然而,通过要求一个完整的上下文,OpenGL 3.0的功能仍然可以通过这些废弃的功能来访问。
废弃的功能如下。
- OpenGL着色语言的1.10和1.20版本
- 索引颜色的渲染目标
- 显示列表
- 用glEnd和glBegin进行直接模式渲染
- 每个固定功能的片段和顶点处理
开放3.1
3.1版本的OpenGL完全删除了在3.0版本中被废弃的每一个方面,宽线例外。从这个版本开始,不可能使用具有完整上下文的新方面,也不可能使用具有向前兼容的上下文的已废弃方面。如果实现支持扩展,即ARB_compatibility,则对前述规则进行了扩展,但这并不保证。
开放3.2
3.2版本的OpenGL在3.0版本的OpenGL所定义的废止方法的基础上,进一步将规范分为兼容性扩展和核心扩展。兼容性配置文件包含固定功能和之前被删除的API,与3.1版OpenGL发布的ARB_compatibility扩展相同,而核心配置文件不包含。另外,3.2版本的OpenGL包含了对1.50版本的GLSL的升级。
OpenGL 3.3
Mesa支持softpipe,软件Driver SWR,以及以前使用NV50的Nvidia卡。
OpenGL 4.0
OpenGL的4.0版本是与3.3版本一起发布的。它是为能够支持Direc3D 11的硬件开发的。与3.0版本的OpenGL一样,这个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 APIs
- 纹理视图,在没有数据复制的情况下阐明不同风格的纹理
- 调试能力,在应用开发时获得调试信息
- 多应用的稳健性和增强的内存安全性
- 硬件支持。英特尔Haswell处理器和更新版本的英特尔图形,AMD Radeon HD 5000系列和更新版本,Nvidia GeForce 400系列和更新版本。
- OpenGL 4.4
- 同时对多个对象进行有效的绑定
- 在界面变量的着色器中更多的布局控制表达
- 缓冲区对象内部的异步查询
- 强化缓冲区对象的使用控制
- 硬件支持。英特尔Broadwell处理器和更新的处理器中的英特尔高清图形,AMD Radeon HD 5000系列和更新的处理器,Nvidia GeForce 400系列和更新的处理器,Tegra K1。
- OpenGL 4.5
- OpenGL ES 3.1 API和着色器兼容性。它用于在桌面系统上实现方便的开发和最新的OpenGL ES应用执行。
- 稳健性。它为WebGL浏览器等应用程序提供了一个安全的环境,例如防止GPU重置影响任何其他活动的应用程序。
- 冲洗控制。应用程序可以在上下文切换之前管理待定命令的冲刷。它实现了多线程的高性能应用。
- DSA(直接状态访问)。对象访问器允许在不绑定对象的情况下修改和查询状态,以提高中间件的灵活性、效率和应用。
- 硬件支持。英特尔Broadwell处理器和更新的处理器中的英特尔高清图形,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月发布。
- 英特尔26.20.100.6861图形驱动程序在Windows 10。2019年5月发布。
- AMD Adrenalin 18.4.1图形驱动在Windows 7 SP1,10版本1803中用于AMD Radeon HD 7700+,HD 8500+和更新版本。2018年4月发布。
- Linux中的Mesa 19.2支持Intel Broadwell和更新版本的OpenGL 4.6。Mesa的20.0版本支持AMD Radeon GPU,而对Nvidia Kepler+的支持正在进行中。另外,Zink作为使用21.1的仿真驱动和软件驱动LLVMpipe支持Mesa 21.0。
- 硬件支持。英特尔Haswell处理器及更新版本,AMD Radeon HD 7000系列及更新版本,Nvidia GeForce 400系列及更新版本。
OpenGL的替代实现
苹果在macOS 10.14 Mojave和iOS 12中减去了OpenGL,以支持Metal。然而,从macOS 13 Ventura开始,它仍然存在(如苹果硅设备)。4.1版本是2011年以来OpenGL的最新支持版本。从MoltenVK的Molten作者那里,有一个库可以将OpenGL调用转换为Metal,这被称为MoltenGL。
有许多项目试图在Vulkan的头上实现OpenGL。ANGEL的Vulkan后端在2020年7月与谷歌实现了OpenGL ES 3.1的一致性。另外,Mesa3D项目也包含这样一个驱动,被称为Zink。
OpenGL的未来
苹果公司于2018年6月在其每个平台(tvOS、macOS和iOS)上减去了OpenGL API,高度鼓励开发者利用他们在2014年宣布的Metal API。只有谷歌操作系统Fuchsia和Stadia支持Vulkan。 id软件在2016年发布了支持Vulkan的id Tech 6游戏引擎的更新,同时保留了对OpenGL的支持。ID Tech 7取消了对OpenGL的支持。
Valve透露,它将在2021年9月17日的未来更新中通过Dota 2删除OpenGL。在三星的支持下,Atypical Games更新了游戏引擎,在每个非苹果平台上利用Vulkan,而不是OpenGL。OpenGL不支持光线追踪,与Vulkan相比,它是用于GPU中视频解码的API。Mesa shaders只支持nVidia。OpenGL不支持使用深度学习的抗锯齿算法–AMD FSR(FidelityFX Super Resolution)和Nvidia DLSS。
在Ubuntu中安装OpenGL
首先,我们将打开我们的终端窗口,在以下命令的帮助下更新软件包库。
$ sudo apt update
现在,我们将在终端窗口运行以下命令。
$ sudo apt-get install freeglut3-dev