39

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

所以...目前我们有 OpenGL 4.2,正如我在某处读到的那样,它需要 dx11 硬件(这是什么意思?)和一组“侧面”库,例如创建窗口。

有最常见的 GLUT,我非常讨厌。主要原因之一是函数调用,它不允许我们在创建主循环的方式上自由。正如一些人所说,它不是为了游戏而设计的。

还有 GLFW,它实际上对我来说非常好和直截了当。出于某种原因,人们将它与 GLUT 一起使用。(它不仅提供窗口初始化,还提供其他实用程序?)

还有 SFML 和 SDL ( SDL < SFML imo ),而它们有时都需要奇怪的方法来使用 OGL,而且在某些情况下并不是很快。

我们还有 GLEW,它是扩展加载实用程序...等等...不是 GLUT/GLFW 已经是扩展了吗?有什么理由使用它,比如有什么真正重要的扩展可以引起兴趣吗?

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

现在让我们提到教育部分。有(在)著名的 NeHe 教程。使用 WinApi 用 C 语言编写,代码非常不清晰,解决方案过时,但仍然是最受欢迎的。可以找到一些像红皮书这样的东西,它们与 2.x 或 3.x 等版本相关,但是只有很少的(和未完成的)教程提到 4.x。

带什么去?

4

6 回答 6

37

所以...目前我们有 OpenGL 4.2,正如我在某处读到的那样,它需要 dx11 硬件(这是什么意思?)和一组“侧面”库,例如创建窗口。

DX11 硬件是……在盒子侧面写有“支持 DirectX 11”的硬件。我不确定你在这里问的是什么;您是否不清楚 Direct3D 是什么、D3D 11 是什么,或者 D3D 11 与以前的版本有什么区别?

仅供参考:D3D 是使用 OpenGL 访问渲染硬件的仅限 Windows 的替代方案。版本 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 硬件上正常运行。

于 2012-01-04T21:21:29.790 回答
19

如果您正在编写游戏,我会避免使用 GLUT 之类的东西,并编写您自己的包装器,这将对您的游戏渲染架构最有意义。

此时我也会避免使用 OpenGL 4.2,除非您只想针对特定平台上的特定硬件,因为支持很少。即,最新版本的 Mac OSX Lion 刚刚添加了对 OpenGL 3.2 的支持。

对于过去几年制造的机器的最全面覆盖,围绕 OpenGL 2.1 构建您的框架,并在有意义的地方添加对更新的 OpenGL 功能的额外支持。整体设计应该是一样的。如果您只对“当前”机器感兴趣,即 2011 年末及以后的机器,请围绕 OpenGL 3 构建您的框架。只有最新的硬件支持 4.2,并且仅在 Windows 和某些 Linux 上。如果您对移动设备和控制台感兴趣,请使用 OpenGL ES 2.0。

GLEW 加载和管理OpenGL Extensions,这是来自不同供应商的硬件扩展,与 GLUT 是一个用于构建 OpenGL 应用程序的工具包,完全不同的东西。我强烈推荐使用 GLEW,因为它将提供一种干净的机制来确定在其上运行的硬件上哪些功能可用,并且将使您免于手动将函数指针分配给适当的函数的任务。

OpenGL SuperBible是一本很不错的书,还可以查看OpenGL Shading Language。你对现代 OpenGL 所做的一切都将涉及到着色器的使用——不再是固定的功能——所以你最大的挑战将是理解 GLSL 以及着色器管道是如何工作的。

于 2012-01-04T21:06:29.277 回答
6

我目前也在学习现代 OpenGL。我也很难找到好的资源,但这是我迄今为止发现的。

我搜索了一本好书,最终得到了OpenGL ES 2.0 Programming Guide,我认为这是现在学习现代 OpenGL 的最佳选择。是的,这本书是关于 OpenGL ES 的,但不要让这吓到你。OpenGL ES 2.0 的好处是 API 的所有慢速部分都已被删除,因此您不会因学习它而养成任何不良习惯,否则它仍然非常接近桌面 OpenGL,仅缺少一些功能,我认为在你掌握了 OpenGL ES 2.0 之后你可以很容易地学习。

另一方面,你没有桌面 OpenGL 的窗口库等混乱,所以关于 OpenGL ES 的书不会帮助你。我认为使用哪些库是非常主观的,但到目前为止,我已经很好地使用了 SDL、ImageMagickOpen Asset Import Library

现在,这本书提供了很好的帮助,但除此之外,还有一个很好的教程集合,从零开始教授现代 OpenGL在 Linux 上的 OpenGL 开发。(我认为它在其他操作系统上仍然有效。)这本书、教程和时不时地看一两眼橙皮书就足以让我了解现代 OpenGL 的基础知识。请注意,我仍然不是该领域的大师,但它绝对让我开始了。

于 2012-01-04T21:07:52.940 回答
3

我同意,现在所有的教程和示例都使用过时的项目文件、boken 链接等,并且如果您寻求帮助,您只会被引导到那些相同的旧教程,因此很难进入 OpenGL。

一开始我真的对 NeHe 教程感到困惑,但当我对 C 语言、在 UNIX 上编译库和其他基础知识有了更深入的了解后,一切就都到位了。

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

我不确定,但我记得我无法正确编译它,但这可能是我当时的经验不足。如果您遇到麻烦,请大声疾呼!

另一个有用的提示是让 Linux VM 运行,然后您可以下载 NeHe Linux 示例代码并开箱即用地编译它。我认为你只需要 GLUT 就可以了。

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

祝你好运!

于 2012-01-04T21:20:28.297 回答
2

现代 OpenGL 的重点是曲面细分和新型着色器程序,所以我建议从 OpenGL 4 曲面细分的独立教程开始,即:http ://prideout.net/blog/?p=48

在手册和教程之后,一个很好的后续是查看基于“新”OpenGL 3/4 之上的开源引擎。作为开发人员之一,我会指出Linderdaum Engine

于 2012-05-14T20:16:06.947 回答
-1

“具有更多 C++ OOP 和着色器方法的现代 OpenGL 编程”让我提到了 Qt。尚未提及,但 Qt 是一个值得学习的库,并且是编写跨平台 C++ 应用程序的最简单方法。我还发现它通常是学习 OpenGL 的最简单方法,因为它可以轻松地为您处理初始化和硬件特定代码。Qt 也有它自己的数学库,所以你需要开始使用 OpenGL 就是 Qt。VPlay 是一个使用 Qt 帮助人们轻松制作游戏的库,因此显然有些人也在使用 Qt 制作游戏。

有关 Qt 和 OpenGL 的简短介绍,请参见我的帖子

我会提到,由于 Qt 抽象了一些 OpenGL 代码,如果您尝试使用 Qt 包装器,API 与 OpenGL 略有不同(尽管可以说更简单)。

至于我对优秀教程或书籍的投票,请查看Anton 的 OpenGL 教程和 Swiftless 教程。Anton 在 Amazon 上的电子书的评价也比我迄今为止看到的任何其他 OpenGL 出版资源都高(而且便宜得多)。

于 2016-01-07T21:48:58.290 回答