学习现代 OpenGL






4.95/5 (92投票s)
现代OpenGL及其价值的简要指南。

引言
好的……所以您想学习现代OpenGL。太棒了!但它到底意味着什么,有哪些选项?您是否必须购买有关这项技术的昂贵书籍,或者一些基本的在线教程就足够了?
在本文中,我将尝试回答上述一些问题,并为您提供一个精彩的OpenGL图形编程世界的指南。
让我们开始吧!
计划
为什么是现代?
我想回答的第一个问题是为什么有“现代OpenGL”这个说法。是否存在“旧OpenGL”?
基本上,现代意味着“使用可编程图形管线”,旧则意味着“固定管线”。
有什么区别?这是一个相当广泛的话题,但现在我认为了解固定管线就像一个黑匣子就足够了。您将顶点数据输入到前端(输入端),最后从帧缓冲器(屏幕)中获得绘制的三角形。当然,您可以根据需要调整这个盒子,但在某些时候,这还不够。
可编程管线更像是一个白色、透明的盒子,您不仅可以将输入数据放入其中并等待结果,还可以插入/更改内部机制。虽然有一个通用的管线形式,但很大一部分是由您完全控制的——这要归功于着色器。
着色器是一个小型程序,可以计算各种事物并在GPU上运行。它可以转换顶点、计算片段的颜色、删除或添加更多三角形,甚至更多。
为了说明这个想法,我准备了两张图
尽管上图非常非常简化,但它们表明可编程管线更加灵活,并且程序员拥有更多的控制权。得益于着色器,人们可以创造出许多使用固定管线无法实现的图形效果。
目前,随着图形API(如OpenGL或DirectX)的新版本发布,我们对GPU的控制越来越强。如果我们看看现代游戏引擎,我们会发现它们的大部分内容完全在GPU上运行。因此,学习现代方法非常重要。
OpenGL主要版本
版本
|
重要变更
|
---|---|
1.1 - 1997年3月
|
固定管线!请注意,1.0版本于1992年发布。 最新的1.x版本是2003年7月的1.5(例如,包括VBO和遮挡查询)。 |
2.0 - 2004年9月
|
OpenGL着色语言正式纳入标准。像素缓冲对象,sRGB。 2.1版本(2006年7月)与DirectX 9.0c相当。 OpenGL 2.0/2.1 是支持广泛旧设备的可靠选择(并且仍然可以使用着色器) |
3.0 - 2008年8月
|
弃用功能列表,帧缓冲对象,浮点纹理,变换反馈,核心配置文件,几何着色器,同步对象。 OpenGL 3.3(2010年3月)可与DX 10相比 |
4.0 - 2010年3月
|
细分着色器,间接绘制,ES2兼容性,程序二进制文件,独立着色器对象,计算着色器。 OpenGL 4.5(2014年8月)可与DX 11.1相比,甚至超越它。 |
您应该学习什么?
我建议初学者学习以下主题
- 计算机图形学基础知识
- 平台差异(PC vs 移动 vs Web vs 游戏机)
- 图形管线——步骤
- 3D数学——矩阵、向量、投影
- 相机模型
- 着色器(顶点和片段)
- 纹理投影
- 缓冲器基础
- 基础光照模型
那么
- 着色器(几何、细分、计算)
- 高级缓冲器内存管理
- 阴影
- 全局光照
- 与驱动程序协作:锁定、最小化内存传输、批处理……
- GPU通用计算(OpenCL、CUDA、计算着色器)
- ...
第二个列表我故意留下了未完成。到您掌握了这些内容时,您将对您想要实现的目标以及如何实现目标有更清晰的认识。
从哪里开始?
当我们理解了自己的动机后,就可以开始学习了。有时这确实是一项艰巨的任务!可用的资源很多,一个人可能会迷失方向并失去最初的热情。
OpenGL Superbible已成为学习OpenGL的标准书籍,实际上我无法推荐其他书。回想我的经历,这是我第一本关于图形编程的书。那时,我拥有第一版!现在我们有了第七版(于2015年8月发布)。
结构
- 基础:第一个三角形、图形管线、数学、缓冲区、着色器。这是一次精彩的管线之旅,让您对它的工作原理有一个概述。
- 细节:顶点、图元和片段处理,帧缓冲区,计算着色器
- 技术:光照、阴影、卡通着色、SSAO、分形
- 高级技术:计算着色器、管线监控、数据加载和访问仲裁、艺术和非照片写实效果。AZDO技术以及如何调试OpenGL应用程序。甚至还有一个章节讨论了非核心但非常重要的扩展,如稀疏纹理和无绑定图形。
- 最新版本的书籍侧重于OpenGL 4.5。这很重要,因为在OpenGL 4.5中,我们应该使用直接状态访问函数,而不是绑定和更新。
- 旧版本的书籍包含关于平台特性的章节。
这本书提供了开始学习甚至精通OpenGL所需的所有信息。这本书既适合初学者,也适合对图形API非常熟悉的人。正如您所见,有基础章节,也有非常高级的主题。写作风格很棒,没有人应该会遇到理解困难。这本书大约有1000页。我保证您会经常回顾这本精彩书籍的内容。
值得一提的是,还有大量的在线内容可以帮助您。Jason L. McKesson在他的arcsynthesis教程中提供了关于现代OpenGL(3.3+)的一些最好的教程。另一个好网站是open.gl和lighthouse3d core,还有learnopengl.com。
此外,如果您想获得更多图形学理论知识,可以参考这两本“核心”书籍
在哪里继续?

当您有了基础并知道如何使用OpenGL后,就可以选择您想发展的领域了。
以前,人们通常会进入渲染引擎开发——这意味着更多的图形效果。但如今,我们也有了Web和移动应用,所以您的重点可能会有所不同。
对于“常规”图形开发,我建议投资一些钱购买两本最近出版的书——实际上是两本食谱书!
其中一本是《OpenGL 4 Shading Language Cookbook》,另一本是《OpenGL Development Cookbook》。
食谱
编程食谱的想法对我来说很新颖,但我从一开始就喜欢它。在这两本书中,都有许多不同的子章节,几乎可以按任何顺序阅读。我们通常从一些简单的例子开始,然后转向更高级的例子,但结构比“普通”编程书籍更宽松。
OpenGL 4 Shading Language是学习最新版本OpenGL——4.3的绝佳资源。它最近得到了更新,内容变得更好。我们涵盖了以下主题
- 前两章介绍GLSL和现代OpenGL
- 另外两章关于光照和纹理使用(例如,不可变纹理!)
- 第5章关于图像处理和屏幕空间效果(如模糊和HDR)
- 然后有一章关于细分和几何着色器
- 第7章涵盖阴影技术
- 另外两章描述了噪点和粒子动画
- 最后,最后一章涉及计算着色器
这些主题为任何图形程序员打下了坚实的基础。
第二本书——OpenGL Development Cookbook——风格与第一本书相似。它使用OpenGL 3.3——稍旧,但仍然有效。这本书描述了相似的领域:OpenGL、GLSL、光照、阴影的介绍……但例子与第一本书不同。您可以比较例子,获得新的视角和编码技术。
重要的是,《OpenGL Development Cookbook》为我们的图形知识库增加了一些其他有价值的章节
- 体积渲染
- 全局光照
- 3D网格文件格式
- 动画系统和物理
总而言之,您可以将这两本书视为一套。顺便说一句:您可以在我的单独的codeproject文章中阅读我关于《OpenGL Development Cookbook》的完整评论。
这两本食谱书对我来说非常有价值,因为它们填补了图形编程书籍中的一个空白。一方面,我们有《SuperBible》这样的入门级书籍,另一方面,有像GPU Pro或ShaderX(以及最近的OpenGL Insights)这样更“硬核”的书籍。食谱书处于中间位置,对于任何具有良好OpenGL知识并想更进一步的人来说,都是很好的资源。
C++总是必需的吗?
正如您可能已经注意到的,所有提到的书籍和网站都使用C++作为代码示例的语言。C++似乎是这个领域中最受欢迎的选择。但如果您懂其他语言,您就不会绝望!
OpenGL只是一个API,并且有许多不同的语言绑定。
所以:
- 对于Java,请查看:Java™ Binding for the OpenGL® API或LWJGL
- 顺便说一句:LWJGL曾被Minecraft使用
- 此外,大多数Android应用程序使用其基于Java的SDK来渲染使用OpenGL ES的图形。
- 对于移动开发(以及HTML5),请查看libgdx——这是一个跨平台游戏和可视化开发框架,基于OpenGL ES 2.0和3.0。语言:Java
- 对于C#(或Visual Basic)——.NET平台——请查看openTK
- 对于JavaScript,只需使用WebGL
- 此外,对于其他语言,请访问此处的OpenGL Wiki页面
值得注意的是,无论您选择哪种编程语言,图形学理论都是相同的。所以,如果您知道如何在一种语言中实现图形效果,那么用另一种不同的语言实现类似效果应该相对容易。
硬件
目前(2014年12月,最新驱动程序),大多数最新的桌面GPU都支持OpenGL 4.*或至少3.*。
下面是一个快速总结
GPU
|
支持的OpenGL版本
|
---|---|
Nvidia GeForce 6 和 7 系列
|
OpenGL 2.1
|
Tesla: NVidia GeForce 8, 9 100, 200, 300 系列
|
OpenGL 3.3
|
Fermi: NVidia GeForce 400, 500 系列
|
OpenGL 4.5
|
Kepler and Maxwell: NVidia GeForce 600, 700 800M, 900 系列
|
OpenGL 4.5
|
AMD Radeon R300, R400, R500,
|
OpenGL 2.0
|
AMD Radeon R600 (HD2000, HD3000), R700 (HD4000)
|
OpenGL 3.3
|
AMD Evergreen (HD5000)
|
OpenGL 4.5
|
AMD * Islands (HD6000, HD7000 and HD8000)
|
OpenGL 4.5
|
AMD Volcanic Islands (R7 and R9) and newer
|
OpenGL 4.5
|
Intel(R) HD Graphics 2000/3000 (Sandy Bridge)
|
OpenGL 3.1
|
Intel(R) HD Graphics 2500/4000 (Ivy Bridge)
|
OpenGL 4.0
|
Intel(R) HD Graphics 4400/4600/5000 (Haswell)
|
OpenGL 4.3
|
如果您想了解更多细节,可以查看这个很棒的OpenGL硬件数据库
AZDO
不久前(在GDC 2014上),有一个关于通过OpenGL获得更高性能的精彩演示。这一系列想法被称为AZDO——“Approaching Zero Driver Overhead”(趋近于零驱动程序开销)。顾名思义,这种方法侧重于最小化驱动程序的工作。通常,GPU有很大的可用功率,但它必须等待驱动程序完成某些工作。
技术简要总结
- 如何更新缓冲区以避免在管线中产生停顿(例如,持久映射缓冲区、孤立、多缓冲区)
- 显式同步(栅栏、锁定)
- 最小化绘制调用次数(例如,间接绘制、批处理)
- 将纹理打包到数组中以加快访问速度,使用无绑定纹理,稀疏纹理
AZDO复杂但强大。它可以释放您引擎的许多潜力。这也是新图形API(如DirectX 12或Vulkan)的一个很好的起点——在这些API中,驱动程序将极简,所有工作都将取决于客户端(程序员)。
OpenGL Next 和 Vulkan?
Vulkan API于2015年GDC(旧金山)宣布,并于2016年2月16日正式发布(Khronos),它是一个新的API,应该能从硬件中释放更多性能。
来自Khronos官方演示
正如您所见,有了Vulkan,我们将获得对GPU/CPU的更多直接控制。驱动程序的工作量最小化。当然,Vulkan是跨平台的:从高端PC到低端移动设备(Mac OS除外)。理论上,我们应该看到更高的帧速率,屏幕上更多的对象,以及更好的硬件利用率。
灵活性和性能是有代价的。您获得了控制权,但驱动程序执行的大部分工作(同步、缓冲区管理、着色器管理、多线程、命令缓冲区)都需要由您的引擎处理。大型引擎无论如何都会进行此类管理,因此它们应该受益最大。但如果您正在进行简单的模拟,并且渲染基本,这可能会造成损失。即使是简单的Vulkan演示,也包含数百行代码仅仅是为了完成一些基本操作。
虽然不适合所有人,但Vulkan带来了许多希望。它完全是新的,因此没有遗留功能的开销。如果您认真对待图形编程,请务必查看代码示例和Vulkan示例。
资源和链接
- GLSL核心教程 » Lighthouse3d.com - 核心版本GLSL教程
- OpenGL - 入门 - 一个广泛且对初学者友好的指南,用于在所有主要平台上使用现代OpenGL进行游戏开发
- 学习现代3D图形编程 - Jason L. McKesson的精彩教程
- reddit/r/opengl - 新闻、问题和教程的中心枢纽之一
- learnopengl.com - 学习OpenGL的另一个绝佳来源(也可作为免费PDF提供)
- Nvidia 最新OpenGL驱动程序
- 2014 GDC的原始AZDO演示
- 我对OpenGL Superbible 7th的完整评论
结论

在本文中,我试图为您提供足够的资源来开始并取得良好的图形编程进展。OpenGL目前是一项非常流行的技术。对于任何具有良好图形API经验的人来说,都将有许多新的可能性。您不仅可以创建AAA级游戏引擎,还可以进军Web或移动开发。而Vulkan则带来了更多(底层)乐趣!
祝您在现代OpenGL的学习旅程愉快!
您也可以在Bartek的博客上找到更多关于OpenGL的信息:http://www.bfilipek.com/。
历史
- 2016年5月23日 - 添加了关于Vulkan的部分,以及其他一些小改进。
- 2015年5月15日 - 改进了OpenGL Superbible的描述,并添加了关于即将推出的第7版的信息。
- 2015年4月23日 - 添加了描述AZDO的部分——一组新的技术,为OpenGL应用程序提供了更高的性能。
- 2015年2月25日 - 添加了目录并更新了硬件表:Intel现在支持GL 4.3(Haswell)+ NVidia支持4.5
- 2014年6月18日 - 更新了硬件表,Radeons HD 5000+支持GL 4.4
- 2014年5月30日 - 添加了硬件部分
- 2014年5月28日 - 扩展了OpenGL版本表,添加了一些额外的链接
- 2014年5月14日 - 初始版本