2018年6月,苹果公司宣布旗下所有操作系统都不再支持OpenGL,让人不禁叹息。于是想回顾一下OpenGL一路走来的历程。下面这个气泡图是我用开源数据可视化技术AntV制作的,它显示了OpenGL家族历次版本更新的时间线。CSDN 的Blog不知道怎么运行代码,所以请移步到我的GitHub Page(https://neil3d.gitee.io/3dengine/gl-brief-history.html),使用交互的版本:鼠标指向版本可以弹出tips,显示版本特性。

OpenGL简史

上世纪90年代,计算机图形还没有进入消费级市场,但高端图形工作站已经进入业界,当时SGI(Silicon Graphics, Inc.)在这个领域当处于领先地位。我们熟悉的《侏罗纪公园》(1993年上映)就是使用 SGI 图形工作站渲染的。SGI拥有专利性的图形API,叫做IRIS GL。后来SGI高瞻远瞩的看到可移植性的重要,于是他们决定对IRIS GL进行修改,并把它当作一种开放标准,这就是1992年6月所发布的OpenGL 1.0版本!同年,由SGI发起成立了 OpenGL架构评审委员会,即OpenGL ARB(Architecture Review Board),初始成员包括康佰(Compaq),IBM,Intel,微软 以及DEC,后来不断有其他公司加入,包括 HP,nVidia,ATI等等。

1993年底DOOM发布,眼看3D游戏已经势不可挡,三位SGI的天才工程师离职创办了 3dfx Interactive,并于1995年11月推出首款3D加速卡VOODOO!虽然是SGI的老人儿,但3dfx对OpenGL一点都不感冒 ,一心推动自己私有的图形API–Glide,这是OpenGL第一个强劲的对手。在1996年3月的E3大展上,共有15个支持VOODOO硬件加速的游戏展出,震撼了业界。

1996年6月id Softwar的经典FPS游戏Quake发布,并立即成为一股热潮!但是id Software的灵魂人物约翰·卡马克拒绝使用3dfx Glide,并于第二年1月推出使用OpenGL加速光栅化渲染的GLQuake。不能支持最热门的3D游戏,3dfx即使在加速卡硬件市场占有85%,也是无比尴尬的!最终3dfx不得不将Glide再封装一层来兼容OpenGL(MiniGL)来化解这一窘境。在VOODOO加速卡15个月之后,它总算赶上了Quake这班车。这已经揭示了3dfx Glide API是没有前途的!有了Quake这样顶级游戏的支持,OpenGL在上世纪90年代成为了无可争议的业界标准。2000年9月,3dfx才决定加入OpenGL ARB,可惜为时已晚。3dfx盛极而衰,2001年1月公司轰然解体,其芯片、专利、品牌皆有NVIDIA收购(现在N卡所使用的SLI多显卡级联技术,最早就出现在3dfx的VOODOO 2加速卡上)。

干掉3dfx Glide之后,OpenGL却迎来了真正的挑战者:Direct3D!

早在1995年微软发布DirectX 1.0的时候就已经包含了Direct3D,但并没有引起业界足够的重视。直到1997年8月发布的DirectX 5.0,对Direct3D进行了重大升级,提供了立即模式和保留模式两种编程模式,业界终于看到了微软对3D API的野心。以卡马克为首的游戏开发者非常不愿意看到3D API标准的分裂,一时间Direct3D反对之声四起,其中包括卡马克在他著名的.plan文件中对Direct3D的吐槽,以及著名的公开信“An Open Letter to Microsoft: Do the Right Thing for the 3D Game Industry”,但这一切都无法动摇Direct3D日益增长的地位,其中也是有一些原因的:

  • 微软虽然也官僚,但执行力和效率仍然比OpenGL ARB高很多;
  • Direct3D选了与OpenGL相反的方向:它选择贴近硬件。适逢GPU从出生到爆发式增长的快速迭代时期,这种方式是更合适的;
  • 微软的Win32 API当时正值鼎盛时期,以此为基础,微软当年是无往不利;

Direct3D 5.0并不是一个成功的版本,它提供的保留模式显得高不成低不就。直到2000年12月Direct3D 8.0率先支持了可编程渲染管线,当时的Pixel Shader 1.1和Vertex Shader 1.1都需要使用汇编语言编写,随后又迅速升级为Direct3D 8.1,支持Pixel Shader 1.4。仅仅两年之后的Direct3D 9.0就支持了高级Shader编程语言:HLSL,以及Shader Model 2.0。可编程渲染管线对于实时渲染无疑是革命性的,Shader刚刚出现时功能及其羸弱,例如Pixel Shader 1.1仅支持12条指令,但它更新迭代的特别快。

高速发展的可编程渲染管线和OpenGL ARB的低效率形成了鲜明的对比!在这段高速发展期,OpenGL落伍了。支持高级Shader编程语言的OpenGL 2.0直到2004年9月才推出,足足比Direct3D 9.0完了将近两年!可以想象NVIDIA,ATI等巨头都是想把自己的强项技术加入到OpenGL新版标准中,或者阻止对方这样做,所以扯皮的过程非常消耗时间。?

2006年7月31日,OpenGL ARB宣布将OpenGL标准的控制权转交给Khronos Group。Khronos Group是一个非盈利组织,它和OpenGL ARB的成员有很多交集。OpenGL的嵌入式版本的子集OpenGL ES,其1.0于2003年7月28日由该组织发布。OpenGL ES后来成为了移动端图形标准,也使得OpenGL家族焕发了第二次青春,直到2014年新的挑战者Metal的出现。

亲历OpenGL历史

我在大学虽然学了图形学课程,但走上工作岗位之后,发现中间还是有很大的Gap。此时非常幸运翻到了《OpenGL超级宝典》这本书。这是一本被名字耽误了的好书,内容翔实,阅读体验流畅,比"红宝书"读起来轻松很多。正是这本书和OpenGL的友好性,帮我开启了3D编程的大门。读完这本书,顺手就写了一个桌球游戏,放到一个国外的共享软件网站,没想到还买了1千多美元呢,哈哈!

在后来的实际项目开发中,我一直想使用OpenGL。印象最深的就是等待OpenGL 2.0。那时候正在准备从头构建一个3D引擎,用于MMORPG项目《功夫世界》的开发。还好没有死等,选择了DirectX 9.0,不过DirectX 9.0c确实也是一代经典!3D编程大神约翰·卡马克本也是OpenGL的坚定支持者,但是在2011年接受采访的时候也改口说"Direct3D现在已经比OpenGL更好了"。

十年之后,加入蚂蚁金融,从事图形相关的开发,搞了1年多WebGL。对GL家族API还是倍感亲切的,不过相关标准的制定进展仍然是龟速。虽然WebGL标准是依据OpenGL ES来制定,但它总要比对应的OpenGL ES版本晚上4,5年的时间!?

最近几年新一代图形API风云骤起:

  • 2014年3月的GDC大会,微软发布DirectX 12
  • 同年6月的WWDC,苹果公司发布了自己的图形API:Metal
  • 次年3月的GDC大会Khronos Group宣布了Vulkan API,被称为OpenGL的继任者

为什么连OpenGL的管理组织Khronos都急着去设计全新的图形API,而不是集中力量其中升级OpenGL呢?我想有一下几点原因:

  • 成也萧何败也萧何,OpenGL对软件开发者特别友好,也就代表它对硬件厂商并不友好。这在早期可能不是太大的问题,但随着GPU越来越强大、越来越复杂,GL驱动这一层也越来越厚。OpenGL显示驱动要维护所有的状态,对API调用进行各种检查,导致Draw Call的额外负担过重。虽然后面加入Draw Instance,Vertex Array Object等来减少API调用,但都是打补丁,不能根本性解决问题。
  • 由于被设计为一个整体的状态机,所以OpenGL API不支持多线程。在CPU走向多核之后,并行编程越来越重要,这就成了一个明显的缺点。

所以,是时候开始Vulkan,Metal或者DirectX 12啦!

参考资料

  • Wiki-MiniGL,https://en.wikipedia.org/wiki/MiniGL
  • Wiki-OpenGL,https://en.wikipedia.org/wiki/OpenGL
  • About the OpenGL ARB
  • OpenGL ARB to Pass Control of OpenGL Specification to Khronos Group
  • Khronos Group,“Vulkan - The Future of High-performance Graphics”,GDC 2015
  • Chris Hecker,“An Open Letter to Microsoft: Do the Right Thing for the 3D Game Industry”,1997

可视化的OpenGL简史相关推荐

  1. 计算机图形学与可视化计算OPENGL 个人作业一

    计算机图形学与可视化计算OPENGL 个人作业一     关键词:OpenGL绘制线.点.球,世界的旋转     背景信息     这是2022年春季学期,北京理工大学,计算机学院,软件工程,开设的一 ...

  2. 数据可视化笔记1 数据可视化简介(简史、分类、功能、目标)

    文章目录 1.什么是数据可视化 2.为什么要数据可视化 3.数据可视化简史 4.数据可视化的分类 5.数据可视化的功能 6.数据可视化的目标 7.数据可视化工具 1.什么是数据可视化 数据可视化: 创 ...

  3. 学习c语言未来的就业方向_语言学习的未来

    学习c语言未来的就业方向 Making quality language learning content is hard. Duolingo, which is perhaps the most p ...

  4. 【我的OpenGL学习进阶之旅】【持续更新】关于学习OpenGL的一些资料

    目录 一.相关书籍 OpenGL 方面 C方面 NDK 线性代数 二.相关博客 2.0 一些比较官方的链接 2.1 OpenGL着色器语言相关 2.2 [[yfan]](https://segment ...

  5. 自己动手做一个虚拟魔方——建模、还原、可视化

    今天为了教妹妹玩儿魔方,又拿起了初中学会的几个公式.其实我拼魔方很菜的,只是知道几个公式(准确的说是三个-)突发奇想,能不能用python建立一个存在于电脑中的数字化普通三阶魔方.这篇文章记录了我从初 ...

  6. iOS 图形编程总结

    http://blog.csdn.net/goohong/article/details/40743883 IOS实现图形编程可以使用三种API(UIKIT.Core Graphics.OpenGL ...

  7. 关于iOS中图片处理的小结

    iOS实现图形编程可以使用三种API(UIKIT.Core Graphics.OpenGL ES及GLKit). 这些api包含的绘制操作都在一个图形环境中进行绘制.一个图形环境包含绘制参数和所有的绘 ...

  8. 《Python数据可视化编程实战》——5.5 用OpenGL制作动画

    本节书摘来异步社区<Python数据可视化编程实战>一书中的第5章,第5.5节,作者:[爱尔兰]Igor Milovanović,更多章节内容可以访问云栖社区"异步社区" ...

  9. 计算机可视化仿真技术opengl,基于OpenGL的三维场景可视化仿真

    摘要: 随着计算机可视化技术的发展,计算机可视化应用的领域不断地拓宽,广泛地应用在科学计算.人工智能仿真.三维图形的制作方面等领域.可视化是计算机技术应用的热门领域,而这个热门领域的核心都集中在三维真 ...

最新文章

  1. 终于!北京无人车,今起也能免费坐
  2. Linux 操作系统原理 — 内存 — Cache 和 Buffer
  3. 小学生python编程教程入门-围观~山东省的小学生Python编程入门都学的什么?
  4. 不管工作压力太大了,还是工作压力太小了;都容易引起开发人员的辞职风波...
  5. 北大先修课 计算机,解读:北大清华大学先修课的那些事
  6. java 加载java文件_如何用JAVA实现加载一个文件?
  7. 闲谈REST API
  8. 自动补全 (自定义)拼音分词器 搜索时注意事项
  9. Java 一步一步教你在控制台打印出菱形
  10. Cisco Packet Tracer安装详解
  11. excel2007打开后是显示为灰色解决办法
  12. 将文件夹中的图片批量分割
  13. 小米拒绝权限_手机用户隐私保护升级:小米MIUI 11支持“空信息授权”
  14. 计算机组成原理总,计算机组成原理总总结复习(88页)-原创力文档
  15. Fluent UDF代码编写
  16. 关于书籍“Composing Programs”1.6.3自定义函数的嵌套定义与非嵌套定义的比较
  17. [Ubuntu 18.04]公共DNS设置[/etc/resolv.conf]
  18. 2020年华为杯第十七届中国研究生数学建模竞赛---回顾记录
  19. TI Z-stack3.0 BDB的理解
  20. mysql迁移后数据对比_Oracle/云MySQL/MsSQL“大迁移”真相及最优方案

热门文章

  1. stp实验心得_STP实验
  2. 日立服务器硬盘沈阳代理,日立(Hitachi)企业级硬盘全系列扫描
  3. 横河EJA压力变送器在脉冲线路堵塞诊断方法
  4. ssm毕设项目疫情社区管理系统4m30y(java+VUE+Mybatis+Maven+Mysql+sprnig)
  5. SAP HANA 链接备忘
  6. Putty和WinSCP如何保持连接不断开
  7. 中国 GitHub 霸榜乱象! 别再给国内程序员丢脸了
  8. js 中断函数执行_js 终止执行的实现方法
  9. CLion+OpenCV 识别身份证号码---检测身份证号码
  10. JavaScript将unix时间戳转为正常时间类型