OpenGL有哪些良好的学习资源?[关闭]


88

我已经在iPhone上使用OpenGL ES已有一段时间了,基本上,我对示例中看到的并作为我自己的一小部分命令感到迷茫。我很想在其他平台上使用OpenGL,并且对它有很好的了解。

每次搜寻书籍时,都会发现这本庞大的圣经,对初学者来说似乎毫无兴趣,而且很难。如果我有两个周末花在学习OpenGL上,那么花时间(和金钱)的最佳方式是什么?


12
我讨厌这样说,但是OpenGL Superbible或OpenGL红皮书学习OpenGL的最佳方法。这是一个复杂的主题,因此这本书需要很大。
雷切尔·布卢姆

6
即使是新人也可以使用吗?
DFectuoso

Answers:


36

在查看OpenGL教程时要小心,因为其中的许多教程(NeHe)只是教给您您不应再做的事情。今天的OpenGL是10年前的另一种野兽。

可以在此处找到一些避免弃用的好示例:http : //www.g-truc.net/post-tech-content-sample.html

OpenGL Samples Pack 4.0.1.0是一个更新,将样本数量增加到58个。包括用于32位和64位Visual Studio 2008和2010的13个OpenGL 4样本,33个OpenGL 3.3样本和12个OpenGL 2样本。


它链接到一座山!
user14170 2013年

65

您可以从中学到很多东西。从OpenGL新手的角度来看,这是我的想法。

OpenGL范例

您可以阅读很多示例代码。G-truc的示例相当广泛,涵盖了许多高级功能。

但是,如果您是初学者,从示例中学习是一种糟糕的学习方式。阅读您不太了解的代码不会告诉您它为什么起作用。确实,以上链接页面上的文字明确正确地指出这些示例不适用于初学者。

从裸露的源代码中学习,除非对其进行大量注释(此时它是教程),这并非易事。尝试这样做会鼓励货物崇拜式编程和复制粘贴代码。要说服自己很容易,当您真正要做的只是将代码从一个位置复制到另一个位置时,您就可以理解某些功能。您可能可以混合和匹配事物,但是如果没有适当的指导材料,则很难获得真正的理解

OpenGL书籍

有相当多的OpenGL开发实际可购买的书籍。我将在这里讨论两个最大的想法。

OpenGL红皮书

从纯粹的实践角度来看,这一点有些问题。请参阅,第7版涵盖GL 3.0和3.1。哪个比较老了。从那时起,OpenGL已经添加了许多有用的功能,这些功能改变了您编写事物的方式。并非全部都是硬件功能。

第8版即将“发布”,涵盖4.1版。关于它是否涵盖旧的固定功能方面尚无定论。

我会说这本书还可以。最大的问题是信息的组织。它更像是一本综合性的参考手册,而不是专为学习而设计的书。这就是我的意思。

教学时应做的最重要的事情之一就是不要给学生过多的重要信息。但是红皮书正是这样做的。引入材料时,会引入很多材料。它对于当前的任务来说是多余的。

您谈论的内容以及谈论的内容对于使您的书籍成为良好的学习资源至关重要。红皮书永远不会保留信息,直到更合适的时间为止。当谈到如何绘制三角形和图元时,它同时谈到了有关绘制三角形和图元的所有内容。它涵盖了每个选项,每个函数,每个参数等。

那不是一个好的信息组织。

OpenGL精湛

本书的第五版仅涵盖核心GL 3.x,因此没有固定功能。

但是,本书的总体结构与第四版的结构大致相同。这似乎是不可能的,因为第4版使用了固定功能,直到很晚才引入着色器。

这是我对这本书的第一抱怨。本质上,作者构建了一个实现固定功能OpenGL形式的库。它包装了VAO,缓冲区对象,着色器和其他各种东西,因此他可以开始绘制对象,矩阵数学和纹理,而不必讨论诸如GL管道如何详细工作之类的事情。

通过隐藏所有这些细节,可以使材料更易于消化。但是,您经常会看到人们不知道如何在没有图书馆的情况下离开超级圣经。他们真的不了解着色器如何连接到缓冲区对象,数据如何沿管道流动等等。

这是一本可以使用的书,比《红皮书》还好。如果其他所有方法都失败了,它将完成工作。但我认为可能会更好。

而且,根据某些审阅者的说法,它似乎错过了某些有用的信息,例如使用归一化值打包属性数据等。

OpenGL在线资料

有许多在线资料可供学习。

NeHe的教程

讷河的教程,如其他人所说,是非常不合时宜的。他们专注于固定功能的OpenGL。人们经常说,固定功能的GL很容易学习,这是事实。但这并不是一个好主意。

了解如何在固定功能管线真正的工作是很难的。我什至可以说这比学习着色器难。一旦获得它,着色器就很简单。了解纹理环境的东西,组合器和诸如此类的东西的复杂性非常棘手,需要经常访问参考文档以确保所有设置正确。即使您正确理解了所有内容,也容易犯一个小错误,导致所有错误。

区别在于您可以在不了解固定功能的情况下使其工作。这鼓励了货物崇拜编程。这使得它可能得到的东西没有真正知道什么人做在屏幕上。在OpenGL.org论坛上,我们不断看到有关固定功能细节的问题,从不知道gluLookAt如何工作的人们到照明困难的人们,再到试图在纹理环境下获得某种特殊效果的人们。

所以不,我不认为NeHe是学习OpenGL的好方法。

上面的评论可用于任何基于非着色器的教程,例如SwiftlessLighthouse等。

Wikibook的OpenGL编程

Wikibook OpenGL编程可能与NeHe等效。它涵盖了GL版本2.1,因为他们希望与移动平台保持联系。如果那对您很重要,那么一定要看这里。

NeHe以及本Wikibook的另一个问题是对源代码的高度关注。文本与代码的比率非常小;有很多代码,但是文本并没有真正解释它是如何工作的。

例如,请看教程2的底部。它介绍了混合。它没有说混合是如何工作的。它没有说出glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)实际含义或含义。它只是说:“这里有一些使事情变得透明的代码。”

那不是最好的学习环境。

不完整的教程

Swiftless有一套OpenGL 4.x教程。榴莲软件还提供了一些基于着色器的OpenGL教程。还有“ OpenGLBook.com”教程

这些共同点是...它们不完整且被遗弃。他们都参加了大约4-5个教程,然后被删除。他们都没有达到纹理,照明或类似的东西。好吧,榴莲确实打了纹理但没有打光。

可以从中得到很多帮助,但是也缺少很多。

无耻的自我提升

回顾我自己的Modern 3D Graphics教程将是一个可怕的利益冲突。因此,我将详细介绍它们背后的组织以及我认为它们很好的原因。

哦,是的,我正在研究教程17。该项目还没有结束。

前三章实际上是关于学习OpenGL管道如何工作的。超级圣经失败了,因为它试图隐藏细节。相反,我试图非常好地解释这些细节。反复。引言以纯文本方式解释了管道。第一个教程通过代码伴奏对其进行了说明。第二篇教程将进一步介绍它。

从那里,我自然而然地开始定位对象。这引入了制服,但是我不想同时加入制服和透视投影。因此,我将两个概念分开。投影之后,深度缓冲似乎是下一步的合理选择,然后是变换和矩阵的工作方式。在那之后,相机。使用四元数进行旋转是后期添加的功能,但是对于新兴的图形程序员来说,这是一件重要的事情。

照明教程又一次建立在另一个之上。漫反射,然后是每个片段的照明,然后是镜面反射。动态范围是一个有趣的选择。大多数介绍性材料都试图避免这种情况,但是我接受了。如果您认为光强度始终在[0,1]范围内,那么您现在不是图形程序员。如果您不知道如何维护线性颜色管线,那么您现在不是图形程序员。

关于冒名顶替者的最后一盏照明灯很奇怪。我尝试设计解决问题的教程,而不仅仅是展示一些OpenGL功能,尤其是在本书编写过程中。我的大部分教程设计都来自于找到讨论某些主题的方法,同时仍然使它们成为真正的问题,而不是显而易见的,“我们现在正在学习X”。几何着色器很困难,因为它们并不能真正解决很多问题。

冒名顶替者代表了一个问题,即GS实际上可以解决问题。此外,它还使我可以谈论其他较少使用的事物,例如discard更改片段的深度。它确实显示了着色器的功能:您可以使一个正方形变成一个球体。

纹理教程也很有趣。我之所以推迟谈论漫反射色纹理的原因之一,是直到第三次才推迟谈论sRGB纹理。这样,我可以讨论围绕纹理的基本问题(加载数据,将它们放入着色器,过滤,钳位等),而不必处理线性问题。因此,我可以将整个教程用于该主题。这使我真正非常强调保持线性颜色管线的重要性。

这是我的宠儿之一。


1
我刚刚开始阅读您的书/源代码,这太不可思议了。非常感谢您免费发布此书!
亚历克斯·科普兰

尽管我是一名电信专家,但只是尝试尝试一下您的教程。对于新手来说,它们真的很棒。唯一的问题是,非官方的opengl sdk无法使用Ubuntu12.04 + Eclipse正确构建。有什么方法可以直接安装它?(就像我们为GL,GLEW,GLU,glut等
所做的那样

@iammilind:“ 无法正确构建构建如何失败?另外,没有“安装”;那是一半的意思。它是一种复制/预制/运行机制,没有任何系统安装,依赖项,PPM或我不了解或不知道如何在Linux中使用的任何其他事项。您将其放置在所需位置,而不是系统认为应该放置的位置。
Nicol Bolas 2012年

1
不幸的是,在Ubuntu中,构建过程preamake本身会失败:( ... ...这将有很大的帮助,如果您有空的话可以尝试使用Ubuntu + Eclipse执行代码教程。是使用您提供的阅读材料并将其与其他一些代码教程相关联,原因是到目前为止,“ arcsynthesis”是我在Web上学习新手OpenGL学习的最佳场所
iammilind

@iammilind:我注意到您没有提交错误报告。您如何期望这些事情一无所获?
Nicol Bolas 2012年


8

我唯一的OpenGL书是“ OpenGL SuperBible,第4版”,第5版将在几周后发布。我认为这对初学者和高级程序员都很好。

编辑:如果您只是在学习编程,我可能会补充说不要追求最新的技术趋势。一旦您成为使用一种方法的专家,就有机会发布5个新的界面/版本。看来,着色器每3个月就会进步一次。因此,选择具有最佳文档(通常是原语)的东西,制作一些程序,然后逐步进行开发,因为将来您很可能会遇到较旧的代码。希望能帮助到你!


我现在正在研究精湛的技艺,对于没有图形背景的人们来说真的很不错,因为它会随着您的介绍解释所有概念。
Spidey

5

像往常一样,最好的学习方法就是做到这一点。我会推迟花钱,除非您觉得从一本教科书中读取真正受益,大多数(如果不是全部)信息都可以在网上找到。在学习OpenGL的基础上,您可能还希望重新学习线性代数,它永远不会伤害您。

我面临的最大问题是,在最新版本的OpenGL中已经描述了很多东西。

我一直能找到的最好的资源是Joe's Blog。最好是介绍现代管道,并以比我在其他地方可以找到的方式更具可读性的方式帮助您了解一些示例。似乎Nehe最近已经更新了几对,虽然他们的课程仍然很旧,但是一些新闻可能会引起人们的兴趣。Lazy Foo'也是一个很好的资源,但是像Nehe一样,其教程使用了专门的材料。

我认为在一个周末或2个星期后,一旦您感到舒适,就去做一个小项目以应用所有内容。突破或俄罗斯方块-您可以集中精力于代码本身。当您离开并尝试做一个实际的项目时,无论多么简单,您都会学到很多。



3

学习OpenGL的最好方法是使用它。我建议编写自己的引擎。这似乎是一项艰巨的任务,确实如此。您的第一个引擎不会很好,但是您会学到很多。

基本上:编写一个引擎,将其用于游戏中,弄清您不喜欢的引擎并重新编写。继续这样做,您会在OpenGL上变得更好。:)

您将需要什么:

  • 加载模型(.obj)的某种方式
  • 加载纹理的某种方式
  • 固定功能管线或着色器中的照明
  • 对于比屏幕上的茶壶稍微复杂的场景,场景图
  • 很多微型工具(3D矢量类,四元数类,相机类,场景管理器等)

这已经是很多工作了。


您能否指出“第一引擎”应具有的有关基本体系结构或组件的任何文档?这实际上似乎是一个很好的方式让我的手脏的Open GL ...
DFectuoso


4
-1编写引擎作为进入gamedev的一种方式并不是很好。例如,您不知道要在引擎中放入什么。scienceninja.com/blog/write-games-not-engines
共产党鸭子

@TheCommunistDuck真的,科学不再了。web.archive链接
bobobobo

2

我通过编写一个“简单”游戏(3D俄罗斯方块)学习了opengl !

尝试创建自己的简单游戏/应用程序:

  • 小行星
  • 简单的侧面滚动器(您可以学习为播放器/敌人加载模型。没有?使用Quake模型)
  • 3D地形生成器

做一些您感兴趣的简单事情!


2

我们在iPhone的Orchard的Craps游戏中做了一些OpenGL(ES),但是它是由具有疯狂3D skillz的程序员处理的。因此,由于这个原因,我一直在学习OpenGL(ES),以便了解自己在说什么,并可以与团队一起编写代码。

Jeff LaMarche的博客(我提供了一系列教程)对我有所帮助,该站点是http://iphonedevelopment.blogspot.com,这是他的OpenGL帖子的链接:http : //iphonedevelopment.blogspot.com/2009/05/ opengl-es-from-ground-up-table-of.html

在OpenGL.org中,有两个有用的链接:http : //www.opengl.org/code/http://www.opengl.org/resources/features/

最好的方法,上面已经说过几次了。跳进去做一些有趣的事情,然后逐步提高。这一切都与了解场景,相机和材质(着色器)有关。一旦掌握了这些概念,就可以开始研究物理引擎,碰撞检测,粒子效果等。!(^_^)

祝一切顺利,凯文


2

好吧,没有人谈论过《OpenGL编程指南》,我没有这个特定的版本,但是较旧的版本还不错。


1
请告诉我更多有关它的信息。我不知道这与超级圣经相比是更好还是与众不同,是否值得值得读这么大的书(没有冒犯,但如果要花20多个小时才能读书,我想确定这是值得的))
DFectuoso 2010年


2

http://www.opengl-tutorial.org/

有针对“现代” OpenGL(3.0 / 4.0内核,例如,没有过时的知识(如glBegin / glEnd)的教程)的教程。尽管本教程使用了着色器,但仍对基础知识进行了详细说明,从而为基础构建了坚实的数学基础。文本通过代码*示例和有用的可视化效果很好地四舍五入。

中级教程涵盖了诸如使用四元数光照图的内容

。* glm用作数学库


1

请注意,学习OpenGL的最佳方法是面向任务的。尝试做某事(例如向您的游戏添加功能),然后查找执行该操作所需的条件

没有更多上下文的情况下,手册和教程真的很无聊-即您想要自己实现的超出教程的内容。


-1

从NeHe开始,快速在屏幕上显示您的第一个三角形。在那里做一些初学者教程,以了解3D编程的基本概念。如您所暗示的,如果提到OpenGL ES,您已经了解3D编程的基础知识(什么是矩阵,它们的用途,如何使用不同的矩阵在屏幕上投影顶点,什么是顶点等),那么我建议您根本不要浪费时间与NeHe在一起,因为它可能会使您慢下来(通过教您一些事情,您以后必须“取消学习”)。

除此之外,我同意最好的学习方法就是边做边学。一个很好的第一个非Hello World项目可能是2D游戏(或2D游戏引擎)。使用适用于2D应用程序的现代OpenGL可以教给您很多相关概念(例如,使用缓冲区和着色器),并且它比3D项目要轻松得多。然后,随后,您可以应用在3D应用程序中学到的知识。


NeHe已过时。同样,尽管艺术创作更容易,并且您通常要处理带纹理的四边形,但是有很多角落情况(例如矢量叉积)使编写2D游戏之前编写3D游戏更加困难。但是,具有3D图形但具有2D游戏玩法的游戏(例如Pong,Breakout等)可能比纯2D / 3D游戏更容易。
2013年

-4

好吧,我一遍又一遍地被告知,nehe的教程是最好的,我想它们也适合您! http://nehe.gamedev.net/ 我买了红皮书...


这似乎是一组有趣的小块,从零到好地方,谢谢!
DFectuoso

2
我必须强烈不同意。是的,NeHe教程已经存在很长时间了,但是它们从来没有一个非常好的风格,并且现在已经过时了。
安德烈亚斯(Andreas)

8
-1 Nehe太过时了。
Axel Gneiting

7
-1。从讷河中学到了各种各样的坏东西!
加布里埃尔·伊森伯格

-1。NeHe应该将其教程标记为过时和过时的。
Quazi Irfan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.