我同意以上几本书,但有几点注意事项:
OpenGL编程第八版指南现已发布,并且已针对现代OpenGL 4.3重做。
SuperBible 5th ed确实为您提供了一个拐杖库,但是当您翻阅本书时,您会重新实现该库的功能,因此,在书的最后,您应该完全精通。如果您使用面向对象的语言,我也强烈建议将OpenGL内容包装在某种东西中。我正在自己的图书馆工作,很有趣,这似乎是必须走的路,我自己实现了它,我了解了所有的来龙去脉,并且只需要放入我实际使用的部分即可。您还可以抽象化一些东西,例如将数据发送到着色器(不是ShinyMaterial.setColor(Red)更好),这还可以让您通过提供旧的替代方法来回溯某些东西。也有oglplus。
学习现代“核心” OpenGL的主要问题是,即使只是绘制一个立方体,也要建立并运行基本管道,您需要了解以下内容:
- 矩阵运算(如果使用C ++,请使用GLM,在这里也需要MatrixStack OpenGL非官方SDK的版本,或者在这里我简单的版本。)
- GLSL着色器编程。
- 将数据绑定到着色器和顶点缓冲区对象。如果您只想学习真正的纯核心配置文件,那么它们都需要同时实现,并且如果有任何损坏,您将什么也看不到,并且几乎不知道哪里出了问题。这还不包括基本照明(除了编程语言之外,您还需要学习着色算法)之类的内容。
但是,您无需从核心配置文件入手。在开始时使用一些不推荐使用的功能,几乎所有内容仍将支持它,然后对其进行现代化。
另一个问题是,“现代” OpenGL确实可以指三件事:
第一个是可编程着色器管线,而不是固定功能管线。自OpenGL 2.0于2004年发布以来,核心的“现代”技术就已成为可能,当时引入的着色器(本教程只是未更新)也具有1.5的顶点缓冲对象(Vertex Buffer Objects)是现代OpenGL的另一个基石。一个问题是,即使在今天,OpenGL开发人员可能甚至无法利用所有这些东西,那里有很多糟糕的上网本,其中只有那些仅支持OpenGL 1.5的英特尔芯片组和仅支持老版本iPhone / Android的手机OpenGL ES 1.1。OpenGL 2.0和OpenGL 3.x / 4.x中这些内容之间的唯一真正区别是,现在对于核心配置文件是强制性的。
现代OpenGL也可以引用3.x,4.x中的新内容。诸如顶点数组对象,帧缓冲区对象,统一缓冲区对象 / std140,布局限定符,GLSL子例程之类的东西等等。我发现的许多内容可以使编写程序变得更好。他们还可以巧妙地改变您的整体发动机管道。这些东西还可以使您通过创建辅助函数等来进行反向移植(例如,编写一个通用的着色器管理器对象,可用于设置统一,如果支持UBO,则可以手动将值上传到着色器) ,也许在其中放一些着色器来重写内容以使其自动化)。这些东西只能在新的视频卡上运行,您不会看到任何支持它的上网本或任何当前的视频游戏机(它们使用自己的OpenGL子集,类似于OpenGL ES)。最新的OSX只有3。
超现代的下一代OpenGL。OpenGL 4.3刚刚发布。它带有计算着色器,glMultiDrawElementsIndirect和着色器存储缓冲区。这允许根本不同的流水线,您可以在其中将所有顶点数据上载到GPU,然后使用计算着色器来计算应绘制的内容,而不是在程序中进行绘制。不幸的是,这是非常新的,所以我不了解任何不错的教程。看一下OpenGL 4.3审查,它概述了它是如何工作的(作者还说有GPU Pro文章即将发布以解释它)。由于是全新的,因此在此阶段将无法获得任何支持(除非您使用的是带有Beta驱动程序的较新的nvidia卡)。尽管您可以使用OpenCL / CUDA来实现其中的一些功能。
我将跳过glBegin,glEnd,glVertex *,glNormal *,glTextCoord *,glTranslate *,glRotate *,glLoadIdenity,glModelViewMatrix等。取而代之的是从没有着色器的顶点缓冲对象开始学习,此时不要只尝试一个白色三角形来尝试3D,因此您不必使用矩阵进行3D操作(因为您将需要学习将它们绑定到着色器,因此在学习旧方法方面毫无意义)。接下来添加到着色器中,由于现在要使用顶点属性,因此您需要更改绑定顶点缓冲区对象的方式。了解如何通过制服向他们传达属性。然后使用GLM学习矩阵运算,将矩阵绑定到着色器并获得3D效果。完成此操作后,基本上就是学习诸如贴图,
一些通用的在线现代OpenGL教程,涵盖了大多数与OpenGL 2.0+兼容的着色器编程管道:
用于其他一般学习资源。OpenGL ES可能是一个很好的起点。OpenGL ES删除了所有不推荐使用的内容。OpenGL 4.1与OpenGL ES完全兼容,因此应该可以使用OpenGL ES程序并在OpenGL 4.1中运行它。两者的基本原理是相同的。
需要注意的一点是,OpenGL ES 3.0刚刚发布,但是由于它是新的,它还没有任何教程或硬件支持。它似乎没有任何重大的根本变化(例如我们在OpenGL ES 1.0-> 2.0中看到的固定管线和着色器模型之间的差异)。因此,您可能不会学习任何过时的东西。
同样,OpenGL ES将经常使用EGL,因此您将需要学习另一种打开窗口的方法,但这并不难。否则,周围会有一些OpenGL ES封装器/仿真器,或者如果有的话(或使用它们的仿真器),您可以在Android / iPhone上学习。
有《Addison Wesley OpenGL ES 2.0编程指南》,与红皮书相当。
您也可以查看GLSL着色器专用的东西,因为这是大多数现代OpenGL所居住的地方。您只需要确保所学内容涵盖OpenGL绑定“胶水”方面即可。
查看OpenGL Shading Language 2nd Edition(橙皮书)。
OpenGL 4.0阴影语言手册涵盖了更多OpenGL前沿内容,但它本身并不是一个全面的教程。一定值得一看,以了解最新的现实世界OpenGL实践,例如统一缓冲区对象和GLSL子例程。
最后,您可以看看WebGL,尽管使用JavaScript会有所不同,并且调试起来会更加困难。