学习现代的OpenGL

我知道过去几年也有类似的问题,但经过一番研究后,我仍然无法决定从哪里学到,应该学什么。 我也希望看到你现在使用更多C ++ OOP和着色器方法的现代OpenGL编程实际观点。 并确保我对某些事情的真正理解是有效的。

所以…目前我们有OpenGL 4.2,当我在某处读取需要dx11硬件(这是什么意思?)和一组“侧”库,例如创build窗口。

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

也有GLFW,这实际上是相当不错,直截了当的我。 出于某种原因,人们将其与GLUT一起使用。 (它不仅提供窗口初始化,还提供其他实用程序?)

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

我们也有GLEW,这是扩展加载实用程序…等待…不是GLUT / GLFW已经是一个扩展? 是否有任何理由使用它,像有什么非常重要的扩展名感兴趣?

直到现在我们有窗口创build(和一些实用程序),但是… OGL不负责加载纹理,不是3D模型。 我还需要多less个其他库?

现在让我们来提一下教育部分。 有(着名的)NeHe教程。 使用WinApi编写,代码非常不明确,过时的解决scheme,但仍然是最受欢迎的。 像红皮书等一些东西可以find,这与像2.x或3.x版本,但只有less数(和未完成)的教程提到4.x.

该怎么办?

如果你正在编写一个游戏,我会避免像GLUT这样的东西,并且编写你自己的包装,这对你的游戏渲染架构来说是最有意义的。

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

为了对过去几年中制作的机器进行最全面的介绍,围绕OpenGL 2.1构build您的框架,并在更合适的地方为更新的OpenGLfunction添加额外的支持。 整体devise应该是一样的。 如果你只是针对“当前”机器,即从2011年下半年开始的机器,则围绕OpenGL 3构build你的框架。只有最新的硬件支持4.2,并且只在Windows和Linux上。 如果您有兴趣定位移动设备和控制台,请使用OpenGL ES 2.0。

GLEW加载和pipe理OpenGL Extensions (这是来自不同厂商的硬件扩展),而不是GLUT(用于构buildOpenGL应用程序的工具包),完全不同。 我强烈推荐使用GLEW,因为它将提供一个干净的机制来确定正在运行的硬件上有哪些function可用,并将您从手动将函数指针分配给相应function的任务中解放出来。

OpenGL SuperBible是一本相当不错的书,同时也检查OpenGL Shading Language 。 你用现代OpenGL所做的一切都将涉及到着色器的使用 – 不再需要固定的function – 所以你最大的挑战就是要了解GLSL以及着色器stream水线如何工作。

所以…目前我们有OpenGL 4.2,当我在某处读取需要dx11硬件(这是什么意思?)和一组“侧”库,例如创build窗口。

DX11硬件是硬件,在框的侧面写有“支持DirectX 11”。 我不确定你在问什么 你不清楚Direct3D是什么,D3D 11是什么,或者D3D 11和以前的版本有什么不同?

仅供参考:D3D是使用OpenGL访问渲染硬件的唯一select。 版本11只是API的最新版本。 与D3D10相比,D3D11增加了一些新的function,但没有什么比初学者更需要的。

OpenGL是一个描述graphics操作的特定接口的规范。 如何创build这个接口不是OpenGL的一部分。 因此,每个平台都有自己的创buildOpenGL上下文的方式。 Windows使用WGL与Win32 API。 X-Windows使用带有GLXfunction的X-Windows API。 等等。

像GLUT,GLFW等库是抽象所有这些差异的库。 他们为你创build和pipe理一个OpenGL窗口,这样你就不必用特定于平台的细节来弄脏你的代码。 你不必使用它们中的任何一个。

当然,如果你有兴趣学习OpenGL ,最好避免处理平台特定的minutae,比如如何照顾HWND等等。

我们也有GLEW,这是扩展加载实用程序…等待…不是GLUT / GLFW已经是一个扩展? 是否有任何理由使用它,像有什么非常重要的扩展名感兴趣?

这是另一个误解。 GLUT是一个图书馆 ,不是一个扩展。 OpenGL扩展是OpenGL的一部分 。 看,OpenGL只是一个规范,一个文档。 您当前使用的OpenGL的实现实现了OpenGLgraphics系统,但是它也可以实现该graphics系统的一些扩展。

GLUT不是OpenGL的一部分; 这只是一个图书馆。 GLUT的工作是创build和pipe理一个OpenGL窗口。 GLEW也是一个库,用于加载OpenGL函数 。 这不是唯一的select,但它是一个受欢迎的。

直到现在我们有窗口创build(和一些实用程序),但是… OGL不负责加载纹理,不是3D模型。 我还需要多less个其他库?

OpenGL不是一个游戏引擎。 这是一个graphics系统,专为与专用graphics硬件接口而devise。 这个工作与诸如从任何types的文件加载任何东西无关。 是的,制作一个游戏需要这个,但是如前所述,OpenGL不是一个游戏引擎。

如果你需要加载一个文件格式来完成你想要做的事情,那么你需要编写代码来完成加载(以及与GL接口所需的格式调整),或者下载一个能为你做的库。 OpenGL维护为不同的任务维护一个相当不错的工具列表 。

有(着名的)NeHe教程。 使用WinApi编写,代码非常不明确,过时的解决scheme,但仍然是最受欢迎的。 像红皮书等一些东西可以find,这与像2.x或3.x版本,但只有less数(和未完成)的教程提到4.x.

该怎么办?

OpenGL维护维护OpenGL东西的在线材料列表,包括老式和现代。

警告:无耻的自我推销遵循!

我的学习graphics教程是相当不错的,有很多部分,目前仍在积极研究中。 它没有教授任何OpenGL 4.x特定的function,但OpenGL 3.3与4.2完全兼容。 所有这些程序在4.x硬件上运行得很好。

我还维护一个非官方的OpenGL SDK。 这是一个有用的工具包,所有这些工具都是通过一个简单的,统一的构build系统来构build的。 这也是相当有据可查的。

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

我search了一本好书,结束了OpenGL ES 2.0编程指南 ,我认为这是现在学习现代OpenGL的最佳select。 是的,这本书是关于OpenGL ES的,但不要让它吓倒你。 关于OpenGL ES 2.0的好处是,API的所有缓慢部分都被删除了,所以在学习时不会有任何坏习惯,但是它仍然非常接近桌面OpenGL,否则只有less数function缺失。认为在掌握了OpenGL ES 2.0之后,您可以轻松学习。

另一方面,你没有与桌面OpenGL的窗口库等混乱,所以OpenGL ES上的书不会帮助你。 我认为这是非常主观的图书馆使用,但到目前为止,我用SDL, ImageMagick和Open Asset Import Librarypipe理得很好。

现在,这本书已经得到了很好的帮助,但除此之外,还有一些很好的教程,从Linux的OpenGL开发中学习现代OpenGL。 (我认为这个名字在其他操作系统上是有效的。)这本书,教程和一两个时间看一眼橙皮书就足以让我了解现代OpenGL的基础知识。 请注意,我仍然不是这个地区的主人,但是这肯定让我开始了。

我同意,现在当所有的教程和例子都使用过时的项目文件,boken链接等时,很难进入OpenGL,如果你要求帮助,你只能指向那些相同的旧教程。

起初,我对NeHe的教程感到非常困惑,但是当我对C语言有了更好的理解,在UNIX和其他基本的东西上编译库时,这一切都落空了。

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

我不知道,但我记得我编译有问题,但这可能是我当时的经验不足。 如果遇到麻烦,给我一个呐喊!

另一个有用的提示是让Linux虚拟机运行,然后你可以下载NeHe Linux示例代码并将其编译出来。 我想你只需要GLUT就可以工作。

GLUT之前我也更喜欢GLFW,主要是因为GLUT没有被主动维护。

祝你好运!

现代OpenGL的重点是tesselation和新的着色器程序types,所以我想build议从一个独立的OpenGL 4 tesselation教程,即: http ://prideout.net/blog/? p=48

在手册和教程之后,一个好的后续步骤是看看那些基于“新”OpenGL 3/4之上的开源引擎。 作为开发者之一,我会指向Linderdaum Engine 。

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

有关Qt和OpenGL的简短介绍,请参阅我的文章 。

我会提到,由于Qt抽象了一些OpenGL代码,如果你正在尝试使用Qt包装,那么API与OpenGL稍有不同(尽pipe可以说比较简单)。

至于我对优秀教程或书的投票,请查看Anton的OpenGL教程和Swiftless教程。 安东在亚马逊上的电子书也被评为比迄今为止所看到的任何其他OpenGL出版的资源(并且更便宜)。