我知道过去几年也有类似的问题,但经过一些研究,我仍然无法决定从哪里学习,应该学习什么。我还想看看你目前对现代OpenGL编程的实际看法,以及更多的C++OOP和着色器方法。并确保我对某些事情的实际理解是有效的。
所以。。。目前我们已经推出了OpenGL 4.2,正如我在某个地方读到的那样,它需要dx11硬件(这意味着什么?)和一组"侧"库,例如创建窗口。
有一种最常见的GLUT,我非常讨厌。其中一个主要原因是函数调用,它不允许我们自由地创建主循环。正如一些人所说,这不是为了游戏。
还有GLFW,它实际上对我来说很好,很直接。出于某种原因,人们把它和GLUT一起使用。(它不仅提供窗口初始化,还提供其他实用程序?)
还有SFML和SDL(SDL<SFML-imo),而它们有时都需要奇怪的方法来使用OGL,而且在某些情况下速度并不快。
我们还有GLEW,它是扩展加载实用程序。。。等待GLUT/GLFW不是已经是一个扩展吗?有什么理由使用它吗,比如有什么真正重要的扩展感兴趣吗?
到目前为止,我们已经有了窗口创建(和一些实用程序),但是。。。OGL不负责加载纹理,也不负责3D模型。我还需要多少其他libs?
现在让我们来谈谈教育部分。有著名的奈何教程。使用WinApi用C编写,代码极不清晰,解决方案过时,但仍然是最受欢迎的解决方案。可以找到一些像红皮书这样的东西,它们与2.x或3.x等版本有关,但只有少数(未完成)教程提到4.x。
搭配什么?
所以。。。目前我们已经推出了OpenGL 4.2,正如我在某个地方读到的那样,它需要dx11硬件(这意味着什么?)和一组"侧"库,例如创建窗口。
DX11硬件是…硬件;支持DirectX 11";写在盒子的侧面。我不知道你在这里问的是什么;您是否不清楚Direct3D是什么,D3D11是什么,或者D3D11与以前版本的区别是什么?
仅供参考: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模型。我还需要多少其他libs?
OpenGL不是一个游戏引擎。这是一个图形系统,设计用于与专用图形硬件接口。这个工作与从任何类型的文件加载任何内容无关。是的,制作游戏需要这个,但正如前面所说,OpenGL不是一个游戏引擎。
如果你需要加载一个文件格式来做你想做的事情,那么你需要编写代码来进行加载(以及与GL接口所需的格式调整),或者下载一个为你做这件事的库。OpenGL Wiki为不同的任务维护了一个非常好的工具列表。
有著名的奈何教程。使用WinApi用C编写,代码极不清晰,解决方案过时,但仍然是最受欢迎的解决方案。可以找到一些像红皮书这样的东西,它们与2.x或3.x等版本有关,但只有少数(未完成)教程提到4.x。
搭配什么?
OpenGL Wiki维护了一个用于学习OpenGL内容的在线材料列表,既有老式的,也有更现代的。
警告:无耻的自我推销随之而来
我的图形学习教程非常好,有很多章节,目前仍在积极开发中。它没有教授任何OpenGL 4.x特定的功能,但OpenGL 3.3与4.2完全兼容。所有这些程序都可以在4.x硬件上正常运行。
如果你正在编写游戏,我会避免使用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扩展,这是来自不同供应商的硬件扩展,而GLUT是用于构建OpenGL应用程序的工具包,这是完全不同的东西。我强烈建议使用GLEW,因为它将提供一个干净的机制来确定在运行它的硬件上哪些功能是可用的,并将使您摆脱必须手动将函数指针分配给适当函数的任务。
OpenGL SuperBible是一本不错的书,也可以看看OpenGL着色语言。使用现代OpenGL所做的一切都将涉及到着色器的使用,不再有固定的功能,因此您最大的挑战将是了解GLSL以及着色器管道的工作方式。
我目前也在学习现代OpenGL。我也很难找到好的资源,但以下是我迄今为止发现的。
我找了一本好书,最终得到了OpenGL ES 2.0编程指南,我认为这是目前学习现代OpenGL的最佳选择。是的,这本书是关于OpenGL ES的,但不要让它吓到你。OpenGL ES 2.0的好处是,API的所有缓慢部分都被删除了,这样你就不会因为学习它而养成任何坏习惯,因为它仍然非常接近桌面OpenGL,只缺少一些功能,我认为在掌握OpenGL ES 2.0后,你可以很容易地学习这些功能。
另一方面,你没有像桌面OpenGL那样在窗口库等方面一团糟,所以关于OpenGL ES的书对你没有帮助。我认为使用哪些库是非常主观的,但到目前为止,我在SDL、ImageMagick和Open Asset Import Library方面做得很好。
现在,这本书是一个很好的帮助,但除此之外,还有一组很好的教程,从Linux上的OpenGL开发开始教授现代OpenGL。(尽管如此,我认为它在其他操作系统上也是有效的。)这本书、教程和偶尔浏览一下Orange book,足以让我了解现代OpenGL的基本知识。请注意,我仍然不是这个领域的大师,但这肯定让我开始了。
我同意现在很难进入OpenGL,因为所有的教程和示例都使用了过时的项目文件、boken链接等,如果你寻求帮助,你只会被引导到那些旧的教程。
一开始我对NeHe教程很困惑,但当我对C、在UNIX上编译库和其他基本内容有了更好的理解后,一切都安排好了。
就纹理加载而言,我可以推荐SOIL:http://www.lonesock.net/soil.html
我不确定,但我记得我在正确编译它时遇到了困难,但这可能是我当时的低级经验。如果你遇到麻烦,叫我一声!
另一个有用的技巧是让一个Linux虚拟机运行,然后你可以下载NeHe Linux示例代码并开箱即用地编译它。我想你只需要GLUT就可以了。
我也更喜欢GLFW而不是GLUT,主要是因为GLUT没有得到积极的维护。
祝你好运!
现代OpenGL的要点是镶嵌和新型着色器程序,因此我建议从OpenGL 4镶嵌的独立教程开始,即:http://prideout.net/blog/?p=48
在手册和教程之后,一个很好的后续行动是看看基于"新"OpenGL 3/4之上的开源引擎。作为开发人员之一,我会把矛头指向Linderdaum引擎。
"采用更多C++OOP和着色器方法的现代OpenGL编程"让我提到了Qt。它还没有被提及,但Qt是一个值得学习的库,是编写跨平台C++应用程序的最简单方法。我还发现它是学习OpenGL的最简单方法,因为它可以轻松地为您处理初始化和硬件特定代码。Qt也有自己的数学库,所以你只需要Qt就可以开始使用OpenGL。VPlay是一个使用Qt帮助人们轻松制作游戏的库,因此显然也有一些人使用Qt制作游戏。
有关Qt和OpenGL的简短介绍,请参阅我的文章。
我要提到的是,由于Qt抽象了一些OpenGL代码,如果您尝试使用Qt包装器,API与OpenGL略有不同(尽管可以说更简单)。
至于我对优秀教程或书籍的投票,请查看Anton的OpenGL教程和Swiftless教程。Anton在亚马逊上的电子书也比我迄今为止看到的任何其他OpenGL出版的资源都要高(而且便宜得多)。