65.9K
CodeProject 正在变化。 阅读更多。
Home

学习现代 OpenGL

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.95/5 (92投票s)

2014年5月14日

CPOL

13分钟阅读

viewsIcon

290011

现代OpenGL及其价值的简要指南。

Shaders + Cube Env Map + Phong Lighting
着色器 + 立方体环境贴图 + Phong光照

引言

好的……所以您想学习现代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.gllighthouse3d core,还有learnopengl.com

此外,如果您想获得更多图形学理论知识,可以参考这两本“核心”书籍

在哪里继续?

带GLSL的法线贴图

当您有了基础并知道如何使用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 ProShaderX(以及最近的OpenGL Insights)这样更“硬核”的书籍。食谱书处于中间位置,对于任何具有良好OpenGL知识并想更进一步的人来说,都是很好的资源。

C++总是必需的吗?

正如您可能已经注意到的,所有提到的书籍和网站都使用C++作为代码示例的语言。C++似乎是这个领域中最受欢迎的选择。但如果您懂其他语言,您就不会绝望!

OpenGL只是一个API,并且有许多不同的语言绑定

所以:

  • 对于Java,请查看:Java™ Binding for the OpenGL® APILWJGL
    • 顺便说一句: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带来了许多希望。它完全是新的,因此没有遗留功能的开销。如果您认真对待图形编程,请务必查看代码示例和Vulkan示例。

Geeks3d提供的Vulkan资源列表

资源和链接

结论

GPU上的水 + 法线贴图 来源:简单的水模拟

在本文中,我试图为您提供足够的资源来开始并取得良好的图形编程进展。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日 - 初始版本

 

学习现代OpenGL - CodeProject - 代码之家
© . All rights reserved.