学习现代OpenGL

39

我知道过去几年有类似的问题,但是在做了一些研究后,我仍然无法确定应该从哪里学习以及应该学习什么。 我还想看到您对现代OpenGL编程,更多的C++ OOP和着色器方法的当前实际观点。并确保我对某些事情的实际理解是有效的。

所以...目前我们有OpenGL 4.2版本,据我所知它需要dx11硬件(这是什么意思?)和一组“辅助”库,例如创建窗口。

最常见的是GLUT,我非常讨厌它。其中一个主要原因是函数调用不允许我们自由地创建主循环。正如一些人所说,它并不适合游戏。

还有GLFW,对我来说实际上相当好而且简单明了。出于某种原因,人们使用它与GLUT配合使用(它不仅提供窗口初始化,还提供其他实用程序吗?)

还有SFML和SDL(SDL < SFML imo),两者有时需要奇怪的方法才能与OGL一起工作,在某些情况下并不真正快速。

还有GLEW,它是扩展加载实用程序...等等...GLUT/GLFW已经是扩展了吗?使用它的任何原因,是否有任何真正重要的扩展值得关注?

到目前为止,我们已经有了窗口创建(和一些实用程序),但是... OGL并没有负责加载纹理或3D模型。我需要多少其他库?

现在让我们提到教育部分。有着名的NeHe教程。使用WinApi编写,代码极其不清晰且过时,但仍然是最流行的教程之一。一些像《Red Book》这样的东西可以找到,这些内容与2.x或3.x版本相关,但只有很少的(未完成的)教程涉及4.x。

应该用什么?


4
你的“问题”缺乏焦点且混乱,引用了许多不正确的事情或对事物运作方式的误解。你能否尝试澄清你想要实现什么以及你需要找出什么? - Nicol Bolas
6
我写过我想要“确保我对某些事情的实际理解是正确的”。 - Neomex
OpenGL是原始的,现代OpenGL则是超级原始的;在理解了OGL 4.x以升级我的现有OGL 2.1项目并阅读了一堆不成熟的教程、下载了200MB的样例(代码风格很差),以及每天两次因愚蠢的矩阵和阅读datenwolf的评论而让我的大脑筋疲力尽之后,我感到非常沮丧!让我沮丧的是Khronos的大规模功能删除政策,而没有在桌子上带来任何新东西。 - xxx
OpenTK很棒,但我更喜欢坚持使用C++,并不是说C#不好或什么的,它肯定有自己的位置,但那只是我的个人喜好,无论如何,谢谢。 - xxx
学习现代OpenGL或任何3D图形,需要对线性代数有相当的理解。三维计算机图形的向量数学教程是迄今为止学习向量和矩阵的最佳资源。它还具有交互性,每个部分都有一个测试问题来验证和巩固该主题的理解。 - legends2k
显示剩余2条评论
6个回答

37
所以,目前我们有OpenGL 4.2版本,据我在某处读到,需要dx11硬件(这是什么意思?)和一组“附带的”库,例如创建窗口。
DX11硬件是...在箱子上写着“支持DirectX 11”的硬件。我不确定你在问什么;你不清楚什么是Direct3D,什么是D3D 11,或者什么将D3D 11与之前的版本分开吗?
FYI:D3D是在Windows上使用OpenGL访问渲染硬件的替代方法。第11版只是API的最新版本。相比于D3D10,D3D11添加了一些新功能,但对于初学者来说并没有太大的用处。
OpenGL是一种描述图形操作特定接口的规范。如何创建此接口不是OpenGL的一部分。因此,每个平台都有自己的方式来创建OpenGL上下文。 Windows使用带WGL的Win32 API。 X-Windows使用具有GLX函数的X-Windows API。等等。
像GLUT、GLFW等库是抽象所有这些差异的库。它们为您创建和管理OpenGL窗口,因此您不必将代码与平台特定的细节混在一起。您不必使用它们中的任何一个。
当然,如果您有兴趣学习OpenGL,最好避免处理特定于平台的细节,例如如何处理HWND等。
我们还有GLEW,它是扩展加载实用程序...等等... GLUT / GLFW不是已经是一个扩展了吗?使用它的任何原因吗,例如有重要的扩展值得关注吗?
这是另一个误解。GLUT是一个,而不是扩展。 OpenGL扩展是OpenGL的一部分。请注意,OpenGL只是规范,即文档。您当前使用的OpenGL实现实现了OpenGL图形系统,但它也可以实现对该图形系统的许多扩展。

GLUT不是OpenGL的一部分,它只是一个库。GLUT的作用是创建和管理OpenGL窗口。GLEW也是一个库,它用于加载OpenGL函数。它不是唯一的选择,但它是一个流行的选择。

目前为止我们已经有了窗口创建(以及一些实用程序),但... OGL不负责加载纹理,也不负责加载3D模型。我需要多少其他库?

OpenGL不是一个游戏引擎。它是一个图形系统,旨在与专用图形硬件进行接口。这项工作与从任何类型的文件中加载任何内容无关。是的,制作游戏需要这样做,但正如先前所述,OpenGL不是一个游戏引擎。

如果你需要加载一个文件格式来做你想做的事情,那么你将需要编写代码来进行加载(并进行必要的格式调整以与GL进行接口),或者下载一个可以为您完成此操作的库。OpenGL Wiki维护着一个相当不错的工具列表,用于不同任务

有一个(臭名昭著的)NeHe教程。使用WinApi编写的C代码,代码极其不清晰,已经过时,但仍然是最受欢迎的教程之一。可以找到一些与2.x或3.x版本相关的东西,如《红宝书》,但只有很少(而且未完成)的教程提到4.x版本。

该选择哪个?

OpenGL Wiki维护着一个用于学习OpenGL的在线材料列表,包括老派和更现代的内容。

警告:接下来是无耻的自我推销!

我关于学习图形学的教程相当不错,有许多章节,并且仍在积极更新。它不教授任何OpenGL 4.x特定功能,但OpenGL 3.3与4.2完全兼容。所有这些程序都可以在4.x硬件上正常运行。


1
绝对是教程的加一分。 - Grimmy
2
非常感谢您的教程。 - Shoe
2
事实上,这是现代OpenGL最好的在线教程。 - Michael IV
对于Mac OS X用户,有一个适配版,这个版本为我节省了很多时间和精力:https://github.com/rsanchezsaez/gltut-glfw - Phantrast

19

如果你正在编写游戏,我建议避免使用像GLUT这样的东西,并编写适合你的游戏渲染架构的自己的包装器。

此时我也建议避免使用OpenGL 4.2,除非你只想针对特定平台上的特定硬件进行目标设置,因为支持性很小。例如,最新版本的Mac OS X Lion刚刚添加了对OpenGL 3.2的支持。

对于过去几年内制造的机器的最全面覆盖,请围绕OpenGL 2.1构建你的框架,并在其中增加对新的OpenGL功能的支持。总体设计应该是相同的。如果你只关心“当前”的机器,即从2011年底开始的机器,则应该围绕OpenGL 3构建框架。只有最新的硬件才支持4.2,而且仅限于Windows和一些Linux。如果你有兴趣针对移动设备和游戏机,请使用OpenGL ES 2.0。

GLEW可以加载和管理OpenGL扩展,这些扩展来自不同厂商的硬件,而GLUT是用于构建OpenGL应用程序的工具包,完全不同的东西。我强烈建议使用GLEW,因为它将提供一种清晰的机制来确定硬件上可用的功能,并使你免于手动分配函数指针到适当的功能的任务。

OpenGL超级宝典是一本不错的书,还可以查看OpenGL着色语言。你在现代OpenGL中所做的任何事情都将涉及使用着色器 - 不再有固定的功能 - 所以你最大的挑战将是理解GLSL和着色器管道的工作方式。


1
终于有人提到了《OpenGL超级宝典》!这是我见过的最好的现代OpenGL入门教材。 - cmannett85

6

我目前也在学习现代OpenGL。我也曾经苦于找不到好的资源,但是这是我迄今为止发现的。

我搜索了一本好书,最终选择了OpenGL ES 2.0编程指南,我认为这是现代OpenGL学习的最佳选择。是的,这本书是关于OpenGL ES的,但不要被吓倒。OpenGL ES 2.0的好处在于它已经删除了API的所有缓慢部分,因此您不会因为在其非常接近桌面OpenGL的时候学习它而养成任何坏习惯,只有少数功能缺失,我认为您在掌握OpenGL ES 2.0之后可以很容易地学习这些功能。

另一方面,您不必像使用桌面OpenGL那样处理窗口库等混乱问题,因此OpenGL ES的书对您没有帮助。我认为使用哪些库非常主观,但到目前为止,我已经成功地使用SDL、ImageMagickOpen Asset Import Library

现在,这本书对我有很大帮助,但除此之外,在Linux上的OpenGL开发网站上还有一系列教授现代OpenGL从基础开始的教程。 (我认为这在其他操作系统上也是有效的。)这本书、教程以及偶尔一两次翻阅橙皮书已经足够让我了解现代OpenGL的基础知识。请注意,我仍然不是该领域的专家,但它绝对让我入门了。


如果你想要一个简单的框架来创建窗口并使用OpenGL进行绘图,我强烈推荐SDL。我认为NeHe仍然是一个很好的指南,尽管一些API已经被移除并替换为更合适的API,这时你需要自己更新它 :)。 - nmjohn

3

我同意现在进入OpenGL比较困难,因为很多教程和示例使用过时的项目文件、坏链接等等。如果你寻求帮助,只会被引向那些老旧的教程。

一开始我对NeHe的教程感到困惑,但是当我对C语言有了更好的理解,并熟悉了UNIX上编译库和其他基本操作后,一切就水到渠成了。

至于纹理加载,我可以推荐SOIL:http://www.lonesock.net/soil.html

我不太确定,但我记得我曾经在正确编译它方面遇到麻烦,但那可能只是我的经验不足。如果你遇到问题,随时联系我!

另一个有用的提示是运行Linux虚拟机,你可以下载NeHe Linux示例代码并立即编译。我认为你只需要GLUT即可。

我也更喜欢GLFW而不是GLUT,主要是因为GLUT没有得到积极维护。

祝你好运!


FreeGLUT仍在开发中。此时没有人应该使用旧的GLUT,因为FreeGLUT与其兼容。 - Nicol Bolas
1
我没有尝试过那个,但如果你习惯于GLUT,它听起来是一个不错的选择。不过,我更喜欢GLFW的语法 :) - oskob
我更喜欢能够创建SRGB帧缓冲,FreeGLUT可以,但出于某种原因GLFW不能。这对我来说是个决定性因素;我拒绝在非线性颜色空间中工作。 - Nicol Bolas
1
@NicolBolas:我猜你可能已经知道了,GLFW 3支持sRGB帧缓冲。 - legends2k

2
现代OpenGL的主要重点是曲面细分和新类型的着色器程序,因此我建议先从独立的OpenGL 4曲面细分教程开始学习,例如:http://prideout.net/blog/?p=48 在学习完手册和教程之后,一个好的跟进是查看那些基于“新”OpenGL 3/4的开源引擎。作为其中一名开发者,我会推荐Linderdaum Engine

-1
“使用更多C++ OOP和着色器方法进行现代OpenGL编程”让我想到了Qt。虽然还没有提到,但Qt是值得学习的库,也是编写跨平台C++应用程序的最简单方式。总的来说,我发现它是学习OpenGL最简单的方式,因为它可以轻松处理初始化和硬件特定代码。Qt还有自己的数学库,所以你只需要使用Qt就可以开始使用OpenGL。VPlay是一个使用Qt帮助人们轻松制作游戏的库,因此显然有一些人也在使用Qt制作游戏。
如果想要了解Qt和OpenGL的简短介绍,请参见我的这篇文章
我要提醒的是,由于Qt抽象了一些OpenGL代码,如果您正在尝试使用Qt包装器,则API与仅使用OpenGL时略有不同(尽管可以说更简单)。
至于我推荐的好教程或书籍,请查看Anton's OpenGL tutorials和Swiftless教程。Anton在亚马逊上的电子书评分也比我迄今为止看到的任何其他OpenGL出版资源都要高(而且价格更便宜)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接