学习现代OpenGL

时间:2012-01-04 20:38:17

标签: c++ opengl shader opengl-4

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

所以...目前我们有OpenGL 4.2,当我读到某处需要dx11硬件时 (这是什么意思?)和一组'侧'库,例如创建窗口。

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

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

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

我们还有GLEW,这是扩展加载实用程序......等待...... GLUT / GLFW已经不是扩展了吗?是否有任何理由使用它,比如是否有任何非常重要的扩展来引起兴趣?

直到现在我们还有窗口创建(以及一些实用程序),但是... OGL不会处理加载纹理,也不会处理3D模型。我需要多少个其他库?

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

该怎么做?

6 个答案:

答案 0 :(得分:37)

  

所以...目前我们已经有了OpenGL 4.2,当我在某处读到需要dx11硬件(这意味着什么?)和一组'侧'库时,例如创建窗口。

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

仅供参考:D3D是使用OpenGL访问渲染硬件的仅限Windows的替代方案。版本11只是API的最新版本。与D3D10相比,D3D11增加了一些新东西,但初学者不需要这么多。

OpenGL是一种描述图形操作的特定接口的规范。 创建此接口的方式不是OpenGL的一部分。因此,每个平台都有自己的方式来创建OpenGL上下文。 Windows将Win32 API与WGL一起使用。 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也是一个用于loading OpenGL functions的库。它不是唯一的替代品,但却很受欢迎。

  

直到现在我们还有窗口创建(以及一些实用程序),但是... OGL不会处理加载纹理,也不会处理3D模型。我需要多少个其他库?

OpenGL不是游戏引擎。它是一个图形系统,专为与专用图形硬件连接而设计。这项工作与从任何类型的文件加载任何东西之类的东西无关。是的,制作游戏需要这样,但如前所述,OpenGL不是游戏引擎。

如果您需要加载文件格式来执行您想要执行的操作,那么您需要编写代码来执行加载(以及与GL接口所需的格式调整)或下载为您执行此操作的库。 OpenGL Wiki维护pretty good list of tools for different tasks

  

有着名的NeHe教程。用C语言编写,使用WinApi,代码极其不清晰,过时的解决方案,但仍然是最受欢迎的解决方案。可以找到像Red Book这样的东西,它们与2.x或3.x这样的版本有关,但是很少有(和未完成的)教程提到4.x.

     

该怎么做?

OpenGL Wiki维护learning OpenGL stuff的在线资料列表,包括老派和更现代的。

警告:无耻的自我推销紧随其后!

My tutorials on learning graphics非常好,有很多部分,但仍在积极开展工作。它没有教授任何OpenGL 4.x特定功能,但OpenGL 3.3与4.2完全兼容。所有这些程序都可以在4.x硬件上运行良好。

I also maintain an unofficial SDK for OpenGL.它是一组有用的实用程序,所有这些实用程序都是由一个简单的统一构建系统构建的。它也有相当好的记录。

答案 1 :(得分: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以及着色器管道如何工作。

答案 2 :(得分: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 development on Linux开始教授现代OpenGL。 (我认为它在其他操作系统上的名称仍然有效。)这本书,教程和一两个偶然的Orange Book已经足以让我理解现代OpenGL的基础知识。请注意,我仍然不是该地区的主人,但它确实让我开始。

答案 3 :(得分:3)

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

我最初对NeHe教程感到困惑,但是当我对C语言有了更好的理解,在UNIX上编译库和其他基本内容时,它们全部落实到位。

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

我不确定,但我记得我在编辑时遇到了麻烦,但那可能是我当时的低级经验。如果遇到麻烦,请给我一个喊叫声!

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

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

祝你好运!

答案 4 :(得分:2)

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

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

答案 5 :(得分:-1)

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

有关Qt和OpenGL的简短介绍,请参阅my post here

我要提一下,由于Qt抽象了一些OpenGL代码,如果你试图使用Qt包装器,那么API与OpenGL略有不同(尽管可以说更简单)。

至于我对优秀教程的投票或预订Anton's OpenGL tutorials和Swiftless教程。安东在亚马逊上的电子书评级也高于我迄今为止看到的任何其他OpenGL出版资源(并且便宜得多)。